11.1 數(shù)據(jù)類型概覽
11.1.1 數(shù)字類型概覽
11.1.2 日期和時間類型概覽
11.1.3 字符串類型概覽
11.1.1 數(shù)字類型概覽
這部分是數(shù)字類型的概覽具滴,有關數(shù)字類型的屬性詳情信息可以查看11.2 數(shù)字類型知押,有關數(shù)字類型的存儲要求可以查看11.8 數(shù)據(jù)類型的存儲要求稻艰。
對于整數(shù)類型涯塔,M表示數(shù)據(jù)的顯示寬度伤锚,這個寬度最大為255琼梆,這個值與整數(shù)類型的取值范圍無關捶码。詳情請查看11.2 數(shù)字類型撕蔼。
對于浮點類型豁鲤,M表示可以存儲的數(shù)字總數(shù)。
如果對數(shù)字類型的列指定ZEROFILL鲸沮,MySQL會自動添加unsigned屬性到列中琳骡。
數(shù)字類型可以是unsigned,也可以是signed讼溺,默認為signed楣号,所以指定signed可以被省略。
SERIAL是BIGINT UNSIGNED AUTO_INCREMENT UNIQUE的別名。
注意
如果對整數(shù)進行減法運算炫狱,當其中一個整數(shù)為unsigned藻懒,那么結果為unsigned,除非MySQL mode的NO_UNSIGNED_SUBTRACTION被設置為enable视译,詳情請查看12.10 Cast Functions and Operators嬉荆。
- BIT[(M)]
bit類型。M表示每個值的位數(shù)憎亚,取值范圍為1到64员寇,如果省略了M,默認為1第美。 - TINYINT[(M)][UNSIGNED][ZEROFILL]
非常小的整數(shù)蝶锋,signed時取值范圍為-128到127,unsigned時取值范圍為0到255什往。 - BOOL, BOOLEAN
這些類型是TINYINT(1)的同義詞扳缕,0表示false,非0表示true别威。
mysql> select if(0, "true", "false");
+------------------------+
| if(0, "true", "false") |
+------------------------+
| false |
+------------------------+
1 row in set (0.00 sec)
mysql> select if(1, "true", "false");
+------------------------+
| if(1, "true", "false") |
+------------------------+
| true |
+------------------------+
1 row in set (0.00 sec)
mysql> select if(2, "true", "false");
+------------------------+
| if(2, "true", "false") |
+------------------------+
| true |
+------------------------+
1 row in set (0.00 sec)
TRUE和FALSE分別是并且只是1和0的別名躯舔,如下所示:
mysql> select if(0=false, "true", "false");
+------------------------------+
| if(0=false, "true", "false") |
+------------------------------+
| true |
+------------------------------+
1 row in set (0.00 sec)
mysql> select if(1=true, "true", "false");
+-----------------------------+
| if(1=true, "true", "false") |
+-----------------------------+
| true |
+-----------------------------+
1 row in set (0.00 sec)
mysql> select if(2=true, "true", "false");
+-----------------------------+
| if(2=true, "true", "false") |
+-----------------------------+
| false |
+-----------------------------+
1 row in set (0.00 sec)
mysql> select if(2=false, "true", "false");
+------------------------------+
| if(2=false, "true", "false") |
+------------------------------+
| false |
+------------------------------+
1 row in set (0.00 sec)
從最后兩條語句的結果可以看出,2既不等于1也不等于0省古。
SMALLINT[(M)][UNSIGNED][ZEROFILL]
較小范圍的整形數(shù)據(jù)類型粥庄,signed取值為-32768到32767,unsigned取值為0到65535豺妓。MEDIUMINT[(M)][UNSIGNED][ZEROFILL]
中等范圍的整形數(shù)據(jù)類型惜互,signed取值為-8388608到8388607,unsigned取值為16777215琳拭。INT[(M)][UNSIGNED][ZEROFILL]
普通范圍的整形數(shù)據(jù)類型训堆,signed取值為-2147483648到2147483647,unsiged取值為4294967295白嘁。INTEGER[(M)][UNSIGNED][ZEROFILL]
INT數(shù)據(jù)類型的同義詞坑鱼。-
BIGINT[(M)][UNSIGNED][ZEROFILL]
大范圍的整形數(shù)據(jù)類型,signed取值為-9223372036854775808到9223372036854775807絮缅,unsigned取值為18446744073709551615鲁沥。
SERIAL是BIGINT UNSIGNED NOT NULL AUTO_INCREMENT UNIQUE的別名。
關于BIGINT列耕魄,需要注意以下事項:- 所有的運算都是使用signed的BIGINT或DOUBLE進行的黍析,所以,除了bit函數(shù)屎开,不要使用大于9223372036854775807(63位)的無符號整數(shù)阐枣,如果使用了马靠,可能會導致運算結果的一些最后的數(shù)字是錯誤的,因為在BIGINT轉為DOUBLE時會出現(xiàn)四舍五入錯誤蔼两。
MySQL可以在以下幾種情況中處理BIGINT:- 在BIGINT列中甩鳄,使用整數(shù)存儲一個大的無符號數(shù)值;
- 對BIGINT列使用MIN(col_name)或MAX(col_name)函數(shù)额划;
- 對兩個都是整數(shù)的操作數(shù)使用 +妙啃,-,*等運算符俊戳。
- 在BIGINT列中揖赴,使用字符串存儲一個精確的整數(shù)值,此時抑胎,MySQL會執(zhí)行字符串到數(shù)字的轉換燥滑,這個過程不涉及中間的雙精度表示;
- +阿逃,-铭拧,*等運算使用BIGINT進行計算,這意味著恃锉,如果對兩個大整數(shù)(或函數(shù)返回的整數(shù)結果)相乘搀菩,當計算結果大于9223372036854775807時,可能會得到意外的結果破托。
- 所有的運算都是使用signed的BIGINT或DOUBLE進行的黍析,所以,除了bit函數(shù)屎开,不要使用大于9223372036854775807(63位)的無符號整數(shù)阐枣,如果使用了马靠,可能會導致運算結果的一些最后的數(shù)字是錯誤的,因為在BIGINT轉為DOUBLE時會出現(xiàn)四舍五入錯誤蔼两。
DECIMAL[(M[,D])][UNSIGNED][ZEROFILL]
定點數(shù)肪跋。M是數(shù)字總位數(shù)(精度),D是小數(shù)點后的位數(shù)(數(shù)值范圍)土砂,小數(shù)點和-號(對于負數(shù))不計入M澎嚣,如果D為0,則沒有小數(shù)部分和小數(shù)點瘟芝,DECIMAL支持的最大位數(shù)(M)為65,最大小數(shù)位數(shù)(D)為30褥琐,如果省略列D锌俱,則默認值為0,省略列M敌呈,默認值為10贸宏。
如果指定列UNSIGNED,不允許負值磕洪。
對于DECIMAL列吭练,所有基礎運算(+,-析显, *鲫咽,/)都以65為精度完成。DEC[(M[,D])][UNSIGNED][ZEROFILL],NUMBER[(M[,D])][UNSIGNED][ZEROFILL],FIXED[(M[,D])][UNSIGNED][ZEROFILL]
這些類型是DECIMAL的同義詞。FIXED可以與其他數(shù)據(jù)庫系統(tǒng)兼容分尸。FLOAT[(M,D)][UNSIGNED][ZEROFILL]
小的(單精度)浮點數(shù)锦聊。取值為-3.402823466E+38 到 -1.175494351E-38,0箩绍,1.175494351E-38到3.402823466E+38孔庭,這是IEEE標準規(guī)定的理論限制,實際取值可能會略小材蛛,具體取決于我們的硬件和操作系統(tǒng)圆到。
M是所有數(shù)字總位數(shù),D是小數(shù)點后的位數(shù)卑吭。如果省略M和D芽淡,存儲的位數(shù)取決于硬件,單精度浮點數(shù)可以精確到大約7為小數(shù)陨簇。
FLOAT(M, D)是非標準的MySQL擴展吐绵。
如果指定了UNSIGNED,不允許負值河绽。
使用FLOAT可能會得到我們意想不到的結果己单,因為MySQL中的計算是使用DOUBLE完成的,可以參看B.4.4.7 解決不匹配行的問題耙饰。FLOAT(p)[UNSIGNED][ZEROFILL]
浮點數(shù)纹笼。p表示以位位單位的精度,MySQL使用p值來確定結果數(shù)據(jù)類型是使用FLOAT還是DOUBLE苟跪。如果p為0到24廷痘,則數(shù)據(jù)類型為FLOAT,沒有M或D值件已;如果p為25到53笋额,則數(shù)據(jù)類型為DOUBLE,沒有M或D值篷扩。結果列的取值范圍與本節(jié)前面介紹的單精度FLOAT和雙精度DOUBLE取值范圍相同兄猩。
FLOAT(p)語法是為了兼容ODBC。DOUBLE[(M,D)][UNSIGNED][ZEROFILL]
普通大屑础(雙精度)浮點數(shù)枢冤,取值為 -1.7976931348623157E+308到-2.2250738585072014E-308,0铜秆,2.2250738585072014E-308到1.7976931348623157E+308淹真。這是IEEE標準規(guī)定的理論限制,實際取值可能會略小连茧,具體取決于我們的硬件和操作系統(tǒng)核蘸。
M是所有數(shù)字總位數(shù)巍糯,D是小數(shù)點后的位數(shù)。如果省略M和D值纱,存儲的位數(shù)取決于硬件鳞贷,雙精度浮點數(shù)可以精確到大約15為小數(shù)。
DOUBLE(M, D)是非標準的MySQL擴展虐唠。
如果指定了UNSIGNED搀愧,不允許負值。DOUBLE PRECISION[(M,D)][UNSIGNED][ZEROFILL],REAL[(M,D)][UNSIGNED][ZEROFILL]
這幾個類型是DOUBLE的同義詞疆偿,意外情況:如果MySQL mode中的REAL_AS_FLOAT設置為enable咱筛,那么,REAL是FLOAT的同義詞而不是DOUBLE杆故。
11.1.2 日期和時間類型概覽
(待續(xù))
11.1.3 字符串類型概覽
(待續(xù))