程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> MYSQL數據庫 >> MySQL綜合教程 >> MySQL中CHAR和VARCHAR類型演化和詳解

MySQL中CHAR和VARCHAR類型演化和詳解

編輯:MySQL綜合教程

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字符集。
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved