MySQL中CHAR和VARCHAR類型演變和詳解
更新時(shí)間:2012年06月26日 10:29:11 作者:
MySQL數(shù)據(jù)庫(kù)的varchar類型在5.0.3以下的版本中的最大長(zhǎng)度限制為255,其數(shù)據(jù)范圍可以是0~255
一、演變:
MySQL數(shù)據(jù)庫(kù)的varchar類型在5.0.3以下的版本中的最大長(zhǎng)度限制為255,其數(shù)據(jù)范圍可以是0~255。
在MySQL5.0.3及以上的版本中,varchar數(shù)據(jù)類型的長(zhǎng)度支持到了65535,也就是說(shuō)可以存放65532個(gè)字節(jié)的數(shù)據(jù),起始位和結(jié)束位占去了3個(gè)字節(jié),也就是說(shuō),在5.0.3以下版本中需要使用固定的TEXT或BLOB格式存放的數(shù)據(jù)可以在高版本中使用可變長(zhǎng)的varchar來(lái)存放,這樣就能有效的減少數(shù)據(jù)庫(kù)文件的大小。
如果在varchar中寫入大于設(shè)定的長(zhǎng)度,默認(rèn)情況下會(huì)截去后面的部分。
二、詳解(MySQL5.1):
CHAR和VARCHAR類型類似,但它們保存和檢索的方式不同。它們的最大長(zhǎng)度和是否尾部空格被保留等方面也不同。在存儲(chǔ)或檢索過(guò)程中不進(jìn)行大小寫轉(zhuǎn)換。
CHAR和VARCHAR類型聲明的長(zhǎng)度表示你想要保存的最大字符數(shù)。例如,CHAR(30)可以占用30個(gè)字符。
CHAR列的長(zhǎng)度固定為創(chuàng)建表時(shí)聲明的長(zhǎng)度。長(zhǎng)度可以為從0到255的任何值。當(dāng)保存CHAR值時(shí),在它們的右邊填充空格以達(dá)到指定的長(zhǎng)度。當(dāng)檢索到CHAR值時(shí),尾部的空格被刪除掉。在存儲(chǔ)或檢索過(guò)程中不進(jìn)行大小寫轉(zhuǎn)換。
VARCHAR列中的值為可變長(zhǎng)字符串。長(zhǎng)度可以指定為0到65,535之間的值。(VARCHAR的最大有效長(zhǎng)度由最大行大小和使用的字符集確定。整體最大長(zhǎng)度是65,532字節(jié))。
同CHAR對(duì)比,VARCHAR值保存時(shí)只保存需要的字符數(shù),另加一個(gè)字節(jié)來(lái)記錄長(zhǎng)度(如果列聲明的長(zhǎng)度超過(guò)255,則使用兩個(gè)字節(jié))。
VARCHAR值保存時(shí)不進(jìn)行填充。當(dāng)值保存和檢索時(shí)尾部的空格仍保留,符合標(biāo)準(zhǔn)SQL。
如果分配給CHAR或VARCHAR列的值超過(guò)列的最大長(zhǎng)度,則對(duì)值進(jìn)行裁剪以使其適合。如果被裁掉的字符不是空格,則會(huì)產(chǎn)生一條警告。如果裁剪非空格字符,則會(huì)造成錯(cuò)誤(而不是警告)并通過(guò)使用嚴(yán)格SQL模式禁用值的插入。
下面的表顯示了將各種字符串值保存到CHAR(4)和VARCHAR(4)列后的結(jié)果,說(shuō)明了CHAR和VARCHAR之間的差別:
請(qǐng)注意上表中最后一行的值只適用不使用嚴(yán)格模式時(shí);如果MySQL運(yùn)行在嚴(yán)格模式,超過(guò)列長(zhǎng)度不的值不保存,并且會(huì)出現(xiàn)錯(cuò)誤。
從CHAR(4)和VARCHAR(4)列檢索的值并不總是相同,因?yàn)闄z索時(shí)從CHAR列刪除了尾部的空格。
通過(guò)下面的例子說(shuō)明該差別:
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ù)分配給列的字符集校對(duì)規(guī)則對(duì)CHAR和VARCHAR列中的值進(jìn)行排序和比較。
請(qǐng)注意所有MySQL校對(duì)規(guī)則屬于PADSPACE類。這說(shuō)明在MySQL中的所有CHAR和VARCHAR值比較時(shí)不需要考慮任何尾部空格。
例如:
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)
請(qǐng)注意所有MySQL版本均如此,并且它不受SQL服務(wù)器模式的影響。
對(duì)于尾部填充字符被裁剪掉或比較時(shí)將它們忽視掉的情形,如果列的索引需要唯一的值,在列內(nèi)插入一個(gè)只是填充字符數(shù)不同的值將會(huì)造成復(fù)制鍵值錯(cuò)誤。
CHAR BYTE是CHAR BINARY的別名。這是為了保證兼容性。
ASCII屬性為CHAR列分配latin1字符集。UNICODE屬性分配ucs2字符集。
MySQL數(shù)據(jù)庫(kù)的varchar類型在5.0.3以下的版本中的最大長(zhǎng)度限制為255,其數(shù)據(jù)范圍可以是0~255。
在MySQL5.0.3及以上的版本中,varchar數(shù)據(jù)類型的長(zhǎng)度支持到了65535,也就是說(shuō)可以存放65532個(gè)字節(jié)的數(shù)據(jù),起始位和結(jié)束位占去了3個(gè)字節(jié),也就是說(shuō),在5.0.3以下版本中需要使用固定的TEXT或BLOB格式存放的數(shù)據(jù)可以在高版本中使用可變長(zhǎng)的varchar來(lái)存放,這樣就能有效的減少數(shù)據(jù)庫(kù)文件的大小。
如果在varchar中寫入大于設(shè)定的長(zhǎng)度,默認(rèn)情況下會(huì)截去后面的部分。
二、詳解(MySQL5.1):
CHAR和VARCHAR類型類似,但它們保存和檢索的方式不同。它們的最大長(zhǎng)度和是否尾部空格被保留等方面也不同。在存儲(chǔ)或檢索過(guò)程中不進(jìn)行大小寫轉(zhuǎn)換。
CHAR和VARCHAR類型聲明的長(zhǎng)度表示你想要保存的最大字符數(shù)。例如,CHAR(30)可以占用30個(gè)字符。
CHAR列的長(zhǎng)度固定為創(chuàng)建表時(shí)聲明的長(zhǎng)度。長(zhǎng)度可以為從0到255的任何值。當(dāng)保存CHAR值時(shí),在它們的右邊填充空格以達(dá)到指定的長(zhǎng)度。當(dāng)檢索到CHAR值時(shí),尾部的空格被刪除掉。在存儲(chǔ)或檢索過(guò)程中不進(jìn)行大小寫轉(zhuǎn)換。
VARCHAR列中的值為可變長(zhǎng)字符串。長(zhǎng)度可以指定為0到65,535之間的值。(VARCHAR的最大有效長(zhǎng)度由最大行大小和使用的字符集確定。整體最大長(zhǎng)度是65,532字節(jié))。
同CHAR對(duì)比,VARCHAR值保存時(shí)只保存需要的字符數(shù),另加一個(gè)字節(jié)來(lái)記錄長(zhǎng)度(如果列聲明的長(zhǎng)度超過(guò)255,則使用兩個(gè)字節(jié))。
VARCHAR值保存時(shí)不進(jìn)行填充。當(dāng)值保存和檢索時(shí)尾部的空格仍保留,符合標(biāo)準(zhǔn)SQL。
如果分配給CHAR或VARCHAR列的值超過(guò)列的最大長(zhǎng)度,則對(duì)值進(jìn)行裁剪以使其適合。如果被裁掉的字符不是空格,則會(huì)產(chǎn)生一條警告。如果裁剪非空格字符,則會(huì)造成錯(cuò)誤(而不是警告)并通過(guò)使用嚴(yán)格SQL模式禁用值的插入。
下面的表顯示了將各種字符串值保存到CHAR(4)和VARCHAR(4)列后的結(jié)果,說(shuō)明了CHAR和VARCHAR之間的差別:
| 值 | CHAR(4) | 存儲(chǔ)需求 | VARCHAR(4) | 存儲(chǔ)需求 |
| '' | ' ' | 4個(gè)字節(jié) | '' | 1個(gè)字節(jié) |
| 'ab' | 'ab ' | 4個(gè)字節(jié) | 'ab ' | 3個(gè)字節(jié) |
| 'abcd' | 'abcd' | 4個(gè)字節(jié) | 'abcd' | 5個(gè)字節(jié) |
| 'abcdefgh' | 'abcd' | 4個(gè)字節(jié) | 'abcd' | 5個(gè)字節(jié) |
從CHAR(4)和VARCHAR(4)列檢索的值并不總是相同,因?yàn)闄z索時(shí)從CHAR列刪除了尾部的空格。
通過(guò)下面的例子說(shuō)明該差別:
復(fù)制代碼 代碼如下:
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ù)分配給列的字符集校對(duì)規(guī)則對(duì)CHAR和VARCHAR列中的值進(jìn)行排序和比較。
請(qǐng)注意所有MySQL校對(duì)規(guī)則屬于PADSPACE類。這說(shuō)明在MySQL中的所有CHAR和VARCHAR值比較時(shí)不需要考慮任何尾部空格。
例如:
復(fù)制代碼 代碼如下:
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)
請(qǐng)注意所有MySQL版本均如此,并且它不受SQL服務(wù)器模式的影響。
對(duì)于尾部填充字符被裁剪掉或比較時(shí)將它們忽視掉的情形,如果列的索引需要唯一的值,在列內(nèi)插入一個(gè)只是填充字符數(shù)不同的值將會(huì)造成復(fù)制鍵值錯(cuò)誤。
CHAR BYTE是CHAR BINARY的別名。這是為了保證兼容性。
ASCII屬性為CHAR列分配latin1字符集。UNICODE屬性分配ucs2字符集。
相關(guān)文章
mysql5.7數(shù)據(jù)庫(kù)安裝完成后如何配置環(huán)境變量
這篇文章主要為大家詳細(xì)介紹了在win10系統(tǒng)下,mysql5.7數(shù)據(jù)庫(kù)安裝完成后配置環(huán)境變量的具體步驟,感興趣的小伙伴們可以參考一下2016-06-06
對(duì)比分析MySQL語(yǔ)句中的IN 和Exists
mysql中in 是把外表和內(nèi)表作hash 連接,而exists是對(duì)外表作loop循環(huán),每次loop循環(huán)再對(duì)內(nèi)表進(jìn)行查詢。一直以來(lái)認(rèn)為exists比in效率高的說(shuō)法是不準(zhǔn)確的。2018-06-06
mysql如何對(duì)String類型的數(shù)字值排序
這篇文章主要介紹了mysql如何對(duì)String類型的數(shù)字值排序問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-08-08
MySQL修改默認(rèn)存儲(chǔ)引擎的實(shí)現(xiàn)方法
下面小編就為大家?guī)?lái)一篇MySQL修改默認(rèn)存儲(chǔ)引擎的實(shí)現(xiàn)方法。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-03-03
mysql 5.7.17 免安裝版配置方法圖文教程(windows10)
這篇文章主要為大家詳細(xì)介紹了windows10下mysql 5.7.17 免安裝版配置方法圖文教程,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-01-01
解決MySQL存儲(chǔ)時(shí)間出現(xiàn)不一致的問(wèn)題
這篇文章主要介紹了解決MySQL存儲(chǔ)時(shí)間出現(xiàn)不一致的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-04-04
銀河麒麟V10安裝MySQL5.7的詳細(xì)過(guò)程
這篇文章主要介紹了銀河麒麟V10安裝MySQL5.7,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-05-05

