《MYSQL數(shù)據(jù)庫MySQL中CHAR和VARCHAR類型演變和詳解》要點:
本文介紹了MYSQL數(shù)據(jù)庫MySQL中CHAR和VARCHAR類型演變和詳解,希望對您有用。如果有疑問,可以聯(lián)系我們。
一、演變: MySQL數(shù)據(jù)庫的varchar類型在5.0.3以下的版本中的最大長度限制為255,其數(shù)據(jù)范圍可以是0~255.
在MySQL5.0.3及以上的版本中,varchar數(shù)據(jù)類型的長度支持到了65535,也就是說可以存放65532個字節(jié)的數(shù)據(jù),起始位和結束位占去了3個字節(jié),也就是說,在5.0.3以下版本中需要使用固定的TEXT或BLOB格式存放的數(shù)據(jù)可以在高版本中使用可變長的varchar來存放,這樣就能有效的減少數(shù)據(jù)庫文件的大小.
如果在varchar中寫入大于設定的長度,默認情況下會截去后面的部分.
二、詳解(MySQL5.1): CHAR和VARCHAR類型類似,但它們保存和檢索的方式不同.它們的最大長度和是否尾部空格被保留等方面也不同.在存儲或檢索過程中不進行大小寫轉換.
CHAR和VARCHAR類型聲明的長度表示你想要保存的最大字符數(shù).例如,CHAR(30)可以占用30個字符.
CHAR列的長度固定為創(chuàng)建表時聲明的長度.長度可以為從0到255的任何值.當保存CHAR值時,在它們的右邊填充空格以達到指定的長度.當檢索到CHAR值時,尾部的空格被刪除掉.在存儲或檢索過程中不進行大小寫轉換.
VARCHAR列中的值為可變長字符串.長度可以指定為0到65,535之間的值.(VARCHAR的最大有效長度由最大行大小和使用的字符集確定.整體最大長度是65,532字節(jié)).
同CHAR對比,VARCHAR值保存時只保存需要的字符數(shù),另加一個字節(jié)來記錄長度(如果列聲明的長度超過255,則使用兩個字節(jié)).
VARCHAR值保存時不進行填充.當值保存和檢索時尾部的空格仍保留,符合標準SQL.
如果分配給CHAR或VARCHAR列的值超過列的最大長度,則對值進行裁剪以使其適合.如果被裁掉的字符不是空格,則會產(chǎn)生一條警告.如果裁剪非空格字符,則會造成錯誤(而不是警告)并通過使用嚴格SQL模式禁用值的插入.
下面的表顯示了將各種字符串值保存到CHAR(4)和VARCHAR(4)列后的結果,說明了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é) |
請注意上表中最后一行的值只適用不使用嚴格模式時;如果MySQL運行在嚴格模式,超過列長度不的值不保存,并且會出現(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服務器模式的影響.
對于尾部填充字符被裁剪掉或比較時將它們忽視掉的情形,如果列的索引需要唯一的值,在列內(nèi)插入一個只是填充字符數(shù)不同的值將會造成復制鍵值錯誤.
CHAR BYTE是CHAR BINARY的別名.這是為了保證兼容性.
ASCII屬性為CHAR列分配latin1字符集.UNICODE屬性分配ucs2字符集.
轉載請注明本頁網(wǎng)址:
http://www.snjht.com/jiaocheng/3872.html