MySQL支持處理空間數(shù)據(jù)的擴展名。
幾種列類型描述使用了下述慣例:
M:表示最大顯示寬度。最大有效顯示寬度是255。
M指示最大顯示寬度。最大有效顯示寬度是255。顯示寬度與存儲大小或類型包含的值的范圍無關(guān)。
D:適用于浮點和定點類型,并表示小數(shù)點后面的位數(shù)。最大可能的值是30,但不應(yīng)大于M-2。
方括號(‘[’和‘]’)表示可選部分。
如果為一個數(shù)值列指定ZEROFILL,MySQL自動為該列添加UNSIGNED屬性。
SERIAL是BIGINT UNSIGNED NOT NULL AUTO_INCREMENT UNIQUE的一個別名。
在整數(shù)列定義中,SERIAL DEFAULT VALUE是NOT NULL AUTO_INCREMENT UNIQUE的一個別名。
BIT[(M)]
位字段類型。M表示每個值的位數(shù),范圍為從1到64。如果M被省略,默認為1。
TINYINT[(M)] [UNSIGNED] [ZEROFILL]
很小的整數(shù)。帶符號的范圍是-128到127。無符號的范圍是0到255。
BOOL,BOOLEAN
是TINYINT(1)的同義詞。zero值被視為假。非zero值視為真。
INT[(M)] [UNSIGNED] [ZEROFILL]
普通大小的整數(shù)。帶符號的范圍是-2147483648到2147483647。無符號的范圍是0到4294967295。
BIGINT[(M)] [UNSIGNED] [ZEROFILL]
大整數(shù)。帶符號的范圍是-9223372036854775808到9223372036854775807。無符號的范圍是0到18446744073709551615。
作為SQL標(biāo)準(zhǔn)的擴展,MySQL也支持整數(shù)類型TINYINT、MEDIUMINT和BIGINT。下面的表顯示了需要的每個整數(shù)類型的存儲和范圍。
類型 | 字節(jié) | 最小值 | 最大值 |
(帶符號的/無符號的) | (帶符號的/無符號的) | ||
TINYINT | 1 | -128 | 127 |
0 | 255 | ||
SMALLINT | 2 | -32768 | 32767 |
0 | 65535 | ||
MEDIUMINT | 3 | -8388608 | 8388607 |
0 | 16777215 | ||
INT | 4 | -2147483648 | 2147483647 |
0 | 4294967295 | ||
BIGINT | 8 | -9223372036854775808 | 9223372036854775807 |
0 | 18446744073709551615 |
CHAR和VARCHAR類型
CHAR和VARCHAR類型類似,但它們保存和檢索的方式不同。它們的最大長度和是否尾部空格被保留等方面也不同。在存儲或檢索過程中不進行大小寫轉(zhuǎn)換。
CHAR和VARCHAR類型聲明的長度表示你想要保存的最大字符數(shù)。例如,CHAR(30)可以占用30個字符。
CHAR列的長度固定為創(chuàng)建表時聲明的長度。長度可以為從0到255的任何值。當(dāng)保存CHAR值時,在它們的右邊填充空格以達到指定的長度。當(dāng)檢索到CHAR值時,尾部的空格被刪除掉。在存儲或檢索過程中不進行大小寫轉(zhuǎn)換。
VARCHAR列中的值為可變長字符串。長度可以指定為0到65,535之間的值。(VARCHAR的最大有效長度由最大行大小和使用的字符集確定。整體最大長度是65,532字節(jié))。
同CHAR對比,VARCHAR值保存時只保存需要的字符數(shù),另加一個字節(jié)來記錄長度(如果列聲明的長度超過255,則使用兩個字節(jié))。
VARCHAR值保存時不進行填充。當(dāng)值保存和檢索時尾部的空格仍保留,符合標(biāo)準(zhǔn)SQL。
如果分配給CHAR或VARCHAR列的值超過列的最大長度,則對值進行裁剪以使其適合。如果被裁掉的字符不是空格,則會產(chǎn)生一條警告。如果裁剪非空格字符,則會造成錯誤(而不是警告)并通過使用嚴(yán)格SQL模式禁用值的插入。參見5.3.2節(jié),“SQL服務(wù)器模式”。
下面的表顯示了將各種字符串值保存到CHAR(4)和VARCHAR(4)列后的結(jié)果,說明了CHAR和VARCHAR之間的差別:
值 | CHAR(4) | 存儲需求 | VARCHAR(4) | 存儲需求 |
'' | ' ' | 4個字節(jié) | '' | 1個字節(jié) |
'ab' | 'ab ' | 4個字節(jié) | 'ab ' | 3個字節(jié) |
'abcd' | 'abcd' | 4個字節(jié) | 'abcd' | 5個字節(jié) |
'abcdefgh' | 'abcd' | 4個字節(jié) | 'abcd' | 5個字節(jié) |
請注意上表中最后一行的值只適用不使用嚴(yán)格模式時;如果MySQL運行在嚴(yán)格模式,超過列長度不的值不保存,并且會出現(xiàn)錯誤。
從CHAR(4)和VARCHAR(4)列檢索的值并不總是相同,因為檢索時從CHAR列刪除了尾部的空格。
通過下面的例子說明該差別:
mysql>CREATE TABLE vc (v VARCHAR(4), c CHAR(4));
Query OK, 0 rows affected (0.02 sec)
mysql>INSERT INTO vc VALUES ('ab ', 'ab ');
Query OK, 1 row affected (0.00 sec)
mysql>SELECT CONCAT(v, '+'), CONCAT(c, '+') FROM vc;
+----------------+----------------+
| CONCAT(v, '+') | CONCAT(c, '+') |
+----------------+----------------+
| ab + | ab+ |
+----------------+----------------+
1 row in set (0.00 sec)
根據(jù)分配給列的字符集校對規(guī)則對CHAR和VARCHAR列中的值進行排序和比較。
請注意所有MySQL校對規(guī)則屬于PADSPACE類。這說明在MySQL中的所有CHAR和VARCHAR值比較時不需要考慮任何尾部空格。例如:
mysql>CREATE TABLE names (myname CHAR(10), yourname VARCHAR(10));
Query OK, 0 rows affected (0.09 sec)
mysql>INSERT INTO names VALUES ('Monty ', 'Monty ');
Query OK, 1 row affected (0.00 sec)
mysql>SELECT myname = 'Monty ', yourname = 'Monty ' FROM names;
+--------------------+----------------------+
| myname = 'Monty ' | yourname = 'Monty ' |
+--------------------+----------------------+
| 1 | 1 |
+--------------------+----------------------+
1 row in set (0.00 sec)
請注意所有MySQL版本均如此,并且它不受SQL服務(wù)器模式的影響。
對于尾部填充字符被裁剪掉或比較時將它們忽視掉的情形,如果列的索引需要唯一的值,在列內(nèi)插入一個只是填充字符數(shù)不同的值將會造成復(fù)制鍵值錯誤。
CHAR BYTE是CHAR BINARY的別名。這是為了保證兼容性。
ASCII屬性為CHAR列分配latin1字符集。UNICODE屬性分配ucs2字符集。
聲明:本網(wǎng)頁內(nèi)容旨在傳播知識,若有侵權(quán)等問題請及時與本網(wǎng)聯(lián)系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com