MYSQL和ORACLE时区设置比较
注意時(shí)區(qū)會(huì)影響TIMESTAMP的取值,默認(rèn)為系統(tǒng)時(shí)區(qū)為TIME_ZONE=SYSTEM,
動(dòng)態(tài)可以修改
set global ?time_zone = '+8:00';?
然后
my.cnf加上,永久修改
default-time_zone = '+8:00'?
The current time zone. This variable is used to initialize the time zone for each client that
connects. By default, the initial value of this is 'SYSTEM'(which means, “use the value of
system_time_zone”).?
也就是說(shuō)每個(gè)鏈接都會(huì)使用這個(gè)參數(shù)作為他的默認(rèn)時(shí)區(qū),而TIMESTMAP是根據(jù)客戶端的時(shí)區(qū)不同
而不同,所以如果如果這個(gè)參數(shù)設(shè)置有誤會(huì)導(dǎo)致TIMESTAMP時(shí)間出現(xiàn)問(wèn)題
MYSQL的測(cè)試:
mysql> select now();
+---------------------+
| now() ? ? ? ? ? ? ? |
+---------------------+
| 2015-06-12 12:10:13 |
+---------------------+
1 row in set (0.00 sec)
mysql> select sysdate();
+---------------------+
| sysdate() ? ? ? ? ? |
+---------------------+
| 2015-06-12 12:10:18 |
+---------------------+
1 row in set (0.00 sec)
mysql> select current_timestamp from dual;
+---------------------+
| current_timestamp ? |
+---------------------+
| 2015-06-12 12:10:46 |
+---------------------+
1 row in set (0.00 sec)
mysql> set time_zone='+00:00';
Query OK, 0 rows affected (0.00 sec)
mysql> select sysdate();
+---------------------+
| sysdate() ? ? ? ? ? |
+---------------------+
| 2015-06-12 04:11:01 |
+---------------------+
1 row in set (0.00 sec)
mysql> select now();
+---------------------+
| now() ? ? ? ? ? ? ? |
+---------------------+
| 2015-06-12 04:11:04 |
+---------------------+
1 row in set (0.00 sec)
mysql> select current_timestamp from dual;
+---------------------+
| current_timestamp ? |
+---------------------+
| 2015-06-12 04:11:06 |
+---------------------+
1 row in set (0.01 sec)
可見MYSQL的NOW(),SYSDATE(),current_timestamp 均跟著客戶端時(shí)區(qū)走的。
oracle:
另外說(shuō)一下ORACLE的時(shí)區(qū)問(wèn)題,ORACLE時(shí)區(qū)分為
dbtimezone和sessiontimezone
其中DBTIMEZONE只和TIMESTAMP WITH LOCAL TIME ZONE有關(guān),在TIMESTAMP WITH LOCAL TIME ZONE類型存入數(shù)據(jù)庫(kù)中,實(shí)際上是轉(zhuǎn)換為DBTIMEZONE的時(shí)間,取出的時(shí)候
自動(dòng)加上客戶端的SESSIONTIMEZONE的偏移量,文檔如下:
TimeStamp with Local Time Zone (TSLTZ) data?stores?internally?the time converted to/from the database timezone (see point 3) from the timezone specified at insert/select time.?
Note that the data stored in the database is normalized to the database time zone, and the time zone offset is?not?stored as part of the column data, the current DBTIMZONE is used. When users retrieve the data, Oracle Database returns it in the users' local session time zone from the current DBTIMEZONE.
而其他的時(shí)間類型和DBTIMEZONE無(wú)關(guān),這也是為什么有了TIMESTAMP WITCH LOCAL TIME ZONE修改DBTIMEZONE不行的原因,因?yàn)槿绻薷牧薉BTIMEZONE會(huì)導(dǎo)致時(shí)間錯(cuò)誤。
實(shí)際上MYSQL的TIMESTAMP類型和ORACLE的TIMESTAMP WITCH LOCAL TIME ZONE類型都是根據(jù)客戶端的時(shí)間來(lái)進(jìn)行返回時(shí)間,但是MYSQL可以簡(jiǎn)單的設(shè)置
time_zone參數(shù)來(lái)改變所有連接的時(shí)區(qū),這樣返回的時(shí)間能夠正確。
在說(shuō)明一下ORACLE的TIMESTAMP和MYSQL的TIMESTAMP完全不同,
ORACLE的TIMESTAMP是為了精確到秒后6位,
而MYSQL的TIMESTAMP是為了更少的存儲(chǔ)單元(DATETIME為4字節(jié),TIMESTAMP為1個(gè)字節(jié))但是范圍為1970的某時(shí)的開始到2037年,而且會(huì)根據(jù)客戶端的時(shí)區(qū)判斷返回值
而sessiontimezone,則影響著客戶端的時(shí)區(qū),TIMESTAMP WITCH LOCAL TIME ZONE也會(huì)跟著這個(gè)時(shí)區(qū)進(jìn)行改變,其他數(shù)據(jù)類型如DATE,TIMESTAMP等不會(huì)受到影響
可以再ALTER SESSION中設(shè)置也可以設(shè)置環(huán)境變量TZ=
如:
ALTER SESSION SET TIME_ZONE = '-05:00';
或者
export TZ='Asia/Shanghai';
做個(gè)簡(jiǎn)單的實(shí)驗(yàn)
SQL> desc testtim;
?Name ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?Null? ? ?Type
?----------------------------------------- -------- ----------------------------
?DATE1 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?TIMESTAMP(6)
?DATE2 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?TIMESTAMP(6) WITH TIME ZONE
?DATE3 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?TIMESTAMP(6) WITH LOCAL TIME?ZONE
SQL> select * from testtim;
DATE1
---------------------------------------------------------------------------
DATE2
---------------------------------------------------------------------------
DATE3
---------------------------------------------------------------------------
12-JUN-15 11.40.02.000000 AM
12-JUN-15 11.40.02.000000 AM +08:00
12-JUN-15 11.40.02.000000 AM
SQL> alter SESSION SET TIME_ZONE = '-05:00';
Session altered.
SQL> select * from testtim;
DATE1
---------------------------------------------------------------------------
DATE2
---------------------------------------------------------------------------
DATE3
---------------------------------------------------------------------------
12-JUN-15 11.40.02.000000 AM
12-JUN-15 11.40.02.000000 AM +08:00
11-JUN-15 10.40.02.000000 PM
最后ORACLE中常用的取時(shí)間函數(shù)的不同:
LOCALTIMESTAMP returns the current date and time in the session time zone in a value of datatype TIMESTAMP, that is date time similar to CURRENT_DATE but the datatype is TIMESTAMP.
CURRENT_TIMESTAMP returns the current date and time in the session time zone, in a value of datatype TIMESTAMP WITH TIME ZONE, that is date time similar to CURRENT_DATE but the datatype is TIMESTAMP WITH TIME ZONE.
SYSTIMESTAMP returns the system date, including fractional seconds and time zone, of the system on which the database resides. The return type is TIMESTAMP WITH TIME ZONE. Unlike SYSDATE, which you can set to a constant using FIXED_DATE, SYSTIMESTAMP will give the system date even though FIXED_DATE is set.
"SYSDATE" and "SYSTIMESTAMP" are purely dependent on the operating system clock, hence it IS depending on the timezone information of this operating system and/or the operating system settings when the database and listener where started.
很顯然LOCALTIMESTAMP和CURRENT_TIMESTAMP都受到客戶端SESSIONTIMEZONE影響,而SYSDATE的不受影響他返回的一定是服務(wù)器ORACLE 設(shè)置的SESSIONTIMEZONE的時(shí)間。如果需要更改客戶端的SYSDATE的取值必須
1、修改服務(wù)器下ORACLE用戶的TZ
2、重啟數(shù)據(jù)庫(kù)
如:
export ?TZ='UTC';
后查看服務(wù)端SYSDATE
SQL> select to_char(sysdate,'YYYY-MM-DD HH24:MI:SS') from dual;
TO_CHAR(SYSDATE,'YY
-------------------
2015-06-12 04:06:34
按理說(shuō)客戶端也應(yīng)該返回這個(gè)值
但是客戶端任然返回
SQL> select to_char(sysdate,'YYYY-MM-DD HH24:MI:SS') from dual;
TO_CHAR(SYSDATE,'YYYY-MM-DDHH2
------------------------------
2015-06-12 12:08:19
重啟后
SQL> select to_char(sysdate,'YYYY-MM-DD HH24:MI:SS') from dual;
TO_CHAR(SYSDATE,'YYYY-MM-DDHH2
------------------------------
2015-06-12 04:09:19
客戶端正常。
總結(jié)一下:
1、ORACLE和MYSQL的timestamp不同
ORACLE的TIMESTAMP是為了精確到秒后6位,
而MYSQL的TIMESTAMP是為了更少的存儲(chǔ)單元(DATETIME為4字節(jié),TIMESTAMP為1個(gè)字節(jié))但是范圍為1970的某時(shí)的開始到2037年,而且會(huì)根據(jù)客戶端的時(shí)區(qū)判斷返回值
MYSQL的TIMESTAMP時(shí)區(qū)敏感這點(diǎn)和ORACLE的TIMESTAMP WITH LOCAL TIME ZONE一致。
2、ORACLE和MYSQL的函數(shù)返回不一樣
ORACLE:
LOCALTIMESTAMP和CURRENT_TIMESTAMP都受到客戶端SESSIONTIMEZONE影響,而SYSDATE,SYSTIMESTAP的不受影響他返回的一定是服務(wù)器ORACLE 設(shè)置的SESSIONTIMEZONE的時(shí)間
MYSQL:
NOW(),SYSDATE(),CURRENT_TIMESTAMP 均受到客戶端連接時(shí)區(qū)影響。
3、oracle的DBTIMEZONE用處不大,只和TIMESTAMP WITH LOCAL TIME ZONE有關(guān)。
4、為了返回一致的數(shù)據(jù)MYSQL設(shè)置TIME_ZONE參數(shù)即可因?yàn)樗敲總€(gè)連接都會(huì)用到的,但是ORACLE最好使用SYSDATE或者SYSTIMESTAMP來(lái)直接取服務(wù)端的SESSIONTIMEZONE下的時(shí)間。
總結(jié)
以上是生活随笔為你收集整理的MYSQL和ORACLE时区设置比较的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: UIColor之【扩展:#FFFFFF
- 下一篇: 2015最火十大Android开源项目,