MySQL資料型別(r3筆記第87天)
今天在本地裝了一個MySQL的學習環境,簡單的熟悉了一下。準備開始好好學習MySQL了。 學習程式語言我都是從資料型別入手。每種程式語言的資料型別都有自己的特點,有點簡單,有的種類豐富。 總體感覺而言,MySQL的資料型別要比oracle豐富的多。用慣了oracle中的資料型別,一般number,varchar2,date就足夠了,最常用的這3個數據型別在MySQL就有著巨大的變化,還是有點不適應。 MySQL中的資料型別都會和你“斤斤計較“,非常的細緻,都在基本資料型別的範圍內。oracle中的資料型別的維度要廣。在http://blog.itpub.net/23718752/viewspace-1339501/中有過一些簡單的總結。 以下表格內容都來自http://www.w3cschool.cc/mysql/mysql-data-types.html,總結得已經很詳細了。 -->數值型別
型別 |
大小 |
範圍(有符號) |
範圍(無符號) |
用途 |
---|---|---|---|---|
TINYINT |
1 位元組 |
(-128,127) |
(0,255) |
小整數值 |
SMALLINT |
2 位元組 |
(-32 768,32 767) |
(0,65 535) |
大整數值 |
MEDIUMINT |
3 位元組 |
(-8 388 608,8 388 607) |
(0,16 777 215) |
大整數值 |
INT或INTEGER |
4 位元組 |
(-2 147 483 648,2 147 483 647) |
(0,4 294 967 295) |
大整數值 |
BIGINT |
8 位元組 |
(-9 233 372 036 854 775 808,9 223 372 036 854 775 807) |
(0,18 446 744 073 709 551 615) |
極大整數值 |
FLOAT |
4 位元組 |
(-3.402 823 466 E+38,1.175 494 351 E-38),0,(1.175 494 351 E-38,3.402 823 466 351 E+38) |
0,(1.175 494 351 E-38,3.402 823 466 E+38) |
單精度浮點數值 |
DOUBLE |
8 位元組 |
(1.797 693 134 862 315 7 E+308,2.225 073 858 507 201 4 E-308),0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308) |
0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308) |
雙精度浮點數值 |
DECIMAL |
對DECIMAL(M,D) ,如果M>D,為M+2否則為D+2 |
依賴於M和D的值 |
依賴於M和D的值 |
小數值 |
-->字元型別
型別 |
大小 |
用途 |
---|---|---|
CHAR |
0-255位元組 |
定長字串 |
VARCHAR |
0-255位元組 |
變長字串 |
TINYBLOB |
0-255位元組 |
不超過 255 個字元的二進位制字串 |
TINYTEXT |
0-255位元組 |
短文字字串 |
BLOB |
0-65 535位元組 |
二進位制形式的長文字資料 |
TEXT |
0-65 535位元組 |
長文字資料 |
MEDIUMBLOB |
0-16 777 215位元組 |
二進位制形式的中等長度文字資料 |
MEDIUMTEXT |
0-16 777 215位元組 |
中等長度文字資料 |
LOGNGBLOB |
0-4 294 967 295位元組 |
二進位制形式的極大文字資料 |
LONGTEXT |
0-4 294 967 295位元組 |
極大文字資料 |
-->日期型別
型別 |
大小(位元組) |
範圍 |
格式 |
用途 |
---|---|---|---|---|
DATE |
3 |
1000-01-01/9999-12-31 |
YYYY-MM-DD |
日期值 |
TIME |
3 |
'-838:59:59'/'838:59:59' |
HH:MM:SS |
時間值或持續時間 |
YEAR |
1 |
1901/2155 |
YYYY |
年份值 |
DATETIME |
8 |
1000-01-01 00:00:00/9999-12-31 23:59:59 |
YYYY-MM-DD HH:MM:SS |
混合日期和時間值 |
TIMESTAMP |
8 |
1970-01-01 00:00:00/2037 年某時 |
YYYYMMDD HHMMSS |
混合日期和時間值,時間戳 |
-->數值型別 所以在oracle我們常使用的number,基本可以使用int來代替了。 在oracle中通過number能夠控制資料的精度,比如我們制定Number(2),那麼你如果數值過界了,就會直接報錯。支援的資料範圍精度也很高。可能在MySQL中會基於資料型別有對應的儲存特性吧。
SQL> create table test (id number(2));
Table created.
SQL> insert into test values(127);
insert into test values(127)
*
ERROR at line 1:
ORA-01438: value larger than specified precision allowed for this column
在MySQL中嘗試,按照tinyint的最大值127,我們輸入128,會直接插入127,沒有報錯,有警告。
mysql> create table test(id tinyint);
Query OK, 0 rows affected (0.07 sec)
mysql> insert into test values(128);
Query OK, 1 row affected, 1 warning (0.02 sec)
mysql> select*from test;
+------+
| id |
+------+
| 127 |
+------+
1 row in set (0.00 sec)
-->字元型別 關於這個資料型別,對於varchar2是最不適應了。MySQL的varchar型別和oracle的varchar2使用是類似的。一個不同支援是MySQL支援的字元長度要小一些,只有256位元組。
mysql中varchar(6)代表可以存放6個漢字,6個字母,或6個數字。 oracle中varchar2(6)代表可以中存放6個位元組。這樣的話mysql中一個漢字佔三個位元組,Oracle中一個漢字佔兩個位元組。 對於lob型別,最大支援長度和oracle一致。都是4G的樣子。MySQL中分得比較細,比較靈活。 -->日期型別 對於日期型別,可能Oracle支援得更廣一些,型別分得更細。考慮了timezone的部分。不過大部分使用來說基本沒什麼差別,我目前還沒有用到timezone相關的資料型別。
Datatype |
Time Zone |
Fractional Seconds |
---|---|---|
DATE |
No |
No |
TIMESTAMP |
No |
Yes |
TIMESTAMP WITH TIME ZONE |
Explicit |
Yes |
TIMESTAMP WITH LOCAL TIME ZONE |
Relative |
Yes |
順帶說一句,oracle和mysql中都可以使用current_date,current_timestamp。
SQL> select current_date from dual;
CURRENT_DATE
------------------
17-DEC-14
SQL> select current_date from dual; select current_date from dual; --oracle中不能並行執行兩個查詢
select current_date from dual; select current_date from dual
*
ERROR at line 1:
ORA-00911: invalid character
mysql> select current_date;select current_date; --mysql裡面就可以很輕巧的實現
+--------------+
| current_date |
+--------------+
| 2014-12-17 |
+--------------+
1 row in set (0.00 sec)
+--------------+
| current_date |
+--------------+
| 2014-12-17 |
+--------------+
1 row in set (0.00 sec)