字符串類型指CHAR、VARCHAR、BINARY、VARBINARY、BLOB、TEXT、ENUM和SET。該節描述了這些類型如何工作以及如何在查詢中使用這些類型。
1.?CHAR和VARCHAR類型
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字符集。
2.?BINARY和VARBINARY類型
BINARY和VARBINARY類類似于CHAR和VARCHAR,不同的是它們包含二進制字符串而不要非二進制字符串。也就是說,它們包含字節字符串而不是字符字符串。這說明它們沒有字符集,并且排序和比較基于列值字節的數值值。
BINARY和VARBINARY允許的最大長度一樣,如同CHAR和VARCHAR,不同的是BINARY和VARBINARY的長度是字節長度而不是字符長度。
BINARY和VARBINARY數據類型不同于CHAR BINARY和VARCHAR BINARY數據類型。對于后一種類型,BINARY屬性不會將列視為二進制字符串列。相反,它致使使用列字符集的二元 校對規則,并且列自身包含非二進制字符字符串而不是二進制字節字符串。例如CHAR(5) BINARY被視為CHAR(5) CHARACTER SET latin1 COLLATE latin1_bin,假定默認字符集是latin1。這不同于BINARY(5),它保存5字節二進制字符串,沒有字符集或 校對規則。
當保存BINARY值時,在它們右邊填充值以達到指定長度。填充值是0x00(零字節)。插入值時在右側添加0x00?on,并且選擇時不刪除尾部的字節。比較時所有字節很重要,包括ORDER BY和DISTINCT操作。比較時0x00字節和空格是不同的,0x00
例如:對于一個BINARY(3)列,當插入時?‘a’?變為?‘a? 国产美女亚洲精品久久久综合| 热久久国产欧美一区二区精品| 久久精品人妻中文系列| 亚洲精品无码久久久久去q| 国产精品视频久久| 久久夜色精品国产亚洲av| 久久精品国产亚洲AV香蕉| 久久99免费视频| 免费久久人人爽人人爽av| 久久91精品久久91综合| 天堂无码久久综合东京热| 国内精品久久久久久99蜜桃| 欧美麻豆久久久久久中文| 亚洲国产精品无码久久一线| 久久久精品午夜免费不卡| 国产精品一区二区久久精品涩爱 | 国产精品免费看久久久| 久久九九久精品国产免费直播| 久久久久成人精品无码中文字幕| 久久99精品国产99久久6男男| 欧美精品久久久久久久自慰| 久久精品女人天堂AV麻| 精品国产一区二区三区久久久狼| 亚州日韩精品专区久久久| 久久99中文字幕久久| 中文字幕乱码久久午夜| 色99久久久久高潮综合影院| 老司机国内精品久久久久| 亚洲国产精品久久久天堂| 久久中文精品无码中文字幕| 久久青草国产精品一区| 久久人人爽人人爽人人AV| 久久99这里只有精品国产| 国产亚洲精久久久久久无码AV| 久久人人爽人人爽人人AV东京热| 久久精品视频一| 精品久久久久久无码中文字幕| 久久精品国产免费一区| 久久综合亚洲欧美成人| 久久久av波多野一区二区| 久久久久av无码免费网|