MySQL中CHAR和VARCHAR類型演化和詳解。本站提示廣大學習愛好者:(MySQL中CHAR和VARCHAR類型演化和詳解)文章只能為提供參考,不一定能成為您想要的結果。以下是MySQL中CHAR和VARCHAR類型演化和詳解正文
1、演化:
MySQL數據庫的varchar類型在5.0.3以下的版本中的最年夜長度限制為255,其數據規模可所以0~255。
在MySQL5.0.3及以上的版本中,varchar數據類型的長度支撐到了65535,也就是說可以寄存65532個字節的數據,肇端位和停止位占去了3個字節,也就是說,在5.0.3以下版本中須要應用固定的TEXT或BLOB格局寄存的數據可以在高版本中應用可變長的varchar來寄存,如許就可以有用的削減數據庫文件的年夜小。
假如在varchar中寫入年夜於設定的長度,默許情形下會截去前面的部門。
2、詳解(MySQL5.1):
CHAR和VARCHAR類型相似,但它們保留和檢索的方法分歧。它們的最年夜長度和能否尾部空格被保存等方面也分歧。在存儲或檢索進程中不停止年夜小寫轉換。
CHAR和VARCHAR類型聲明的長度表現你想要保留的最年夜字符數。例如,CHAR(30)可以占用30個字符。
CHAR列的長度固定為創立表時聲明的長度。長度可認為從0到255的任何值。當保留CHAR值時,在它們的左邊填充空格以到達指定的長度。當檢索到CHAR值時,尾部的空格被刪除失落。在存儲或檢索進程中不停止年夜小寫轉換。
VARCHAR列中的值為可變長字符串。長度可以指定為0到65,535之間的值。(VARCHAR的最年夜有用長度由最年夜行年夜小和應用的字符集肯定。全體最年夜長度是65,532字節)。
同CHAR比較,VARCHAR值保留時只保留須要的字符數,另加一個字節來記載長度(假如列聲明的長度跨越255,則應用兩個字節)。
VARCHAR值保留時不停止填充。當值保留和檢索時尾部的空格仍保存,相符尺度SQL。
假如分派給CHAR或VARCHAR列的值跨越列的最年夜長度,則對值停止裁剪以使其合適。假如被裁失落的字符不是空格,則會發生一條正告。假如裁剪非空格字符,則會形成毛病(而不是正告)並經由過程應用嚴厲SQL形式禁用值的拔出。
上面的表顯示了將各類字符串值保留到CHAR(4)和VARCHAR(4)列後的成果,解釋了CHAR和VARCHAR之間的差異:
值
CHAR(4)
存儲需求
VARCHAR(4)
存儲需求
''
' '
4個字節
''
1個字節
'ab'
'ab '
4個字節
'ab '
3個字節
'abcd'
'abcd'
4個字節
'abcd'
5個字節
'abcdefgh'
'abcd'
4個字節
'abcd'
5個字節請留意上表中最初一行的值只實用不應用嚴厲形式時;假如MySQL運轉在嚴厲形式,跨越列長度不的值不保留,而且會湧現毛病。
從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)
依據分派給列的字符集校訂規矩對CHAR和VARCHAR列中的值停止排序和比擬。
請留意一切MySQL校訂規矩屬於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辦事器形式的影響。
關於尾部填充字符被裁剪失落或比擬時將它們疏忽失落的情況,假如列的索引須要獨一的值,在列內拔出一個只是填充字符數分歧的值將會形成復制鍵值毛病。
CHAR BYTE是CHAR BINARY的別號。這是為了包管兼容性。
ASCII屬性為CHAR列分派latin1字符集。UNICODE屬性分派ucs2字符集。