二進制字元串的比較是通過逐個位元組的比較位元組數值來進行的。二進制字元串不和字元集相關聯。
非二進制字元串是一個Collation列,他存放包含特定字元集和Collation的文本,字元集規定了能夠存入字元串的文本,而Collation則規定了對字元進行比較和排序的時候的特性。
是以說非二進制字元串的特征之一就是他們有一個字元集。
如果想檢視系統中有哪些字元集的話庫銀使用下面的指令:
輸出的結果很長,我截取了一些:
有些字元集隻包含單位元組字元,而有些字元集包含多位元組字元。有些多位元組字元集中的字元有固定數目的位元組來表示,但是有些多位元組字元集中的字元長度卻是可變的。比如unicode使用ucs2字元集來儲存,其中的字元都占2個位元組,也可以使用utf-8字元集來表示,其中的每個字元都占用一個到3個位元組不等。
我們可以使用LRNGTH()和CHAR_LENGTH()函數來判斷給定的字元串中是否包含多位元組字元。這兩個函數分别傳回字元串中的位元組數和字元數。如果LENGTH()的值大于CHAR_LENGTH()的大小,那麼一定有多位元組字元。
+------------+-----------------+
| length(@s) | char_length(@s) |
| 6 | 3 |
+------------+-----------------+
從結果中可以看出每個ucs2字元串都包含多位元組字元。
雖然unicode字元集utf8中包含多位元組字元,但是一個具體的utf8字元串卻可能隻包含單位元組字元,比如:
| 3 | 3 |
非二進制字元串的另外一個特征是Collation,她決定字元串中字元排序的次序,如果想檢視系統中有哪些Collation可用:
輸出結果很長,我截取了一部分:
+--------------------------+----------+-----+---------+----------+---------+
| Collation | Charset | Id | Default | Compiled | Sortlen |
| big5_chinese_ci | big5 | 1 | Yes | Yes | 1 |
| big5_bin | big5 | 84 | | Yes | 1 |
| dec8_swedish_ci | dec8 | 3 | Yes | Yes | 1 |
| dec8_bin | dec8 | 69 | | Yes | 1 |
當沒有指定使用何種Collation的是,Default中為Yes的collation就是這個字元集中字元串預設的Cllation。預設的Collation也可以使用:show character set; 進行檢視。
Collation可以是大小寫敏感的,大小寫不敏感的,或者二進制的。名稱ci,cs,bin結尾的Collation分别是大小寫不敏感,大小寫敏感、二進制的。
二進制字元串的比較總是以單個位元組為單元的,而二進制Collation對于非二進制字元和竄的比較卻是以字元為單元的。
下面的例子說明了Collation如何影響排序結果:
+------+
| c |
| AAA |
| bbb |
| aaa |
| BBB |
+------+
通過對列使用collate操作符,我們可以在選擇排序的時候使用哪一個Collation進而影響結果順序:
1)一個大小寫不敏感的Collation将會吧a和A排列在一起。比如:
2)一個大小寫敏感的Collation将會吧A和a排列在B和b的簽名但是還會将大寫排在小寫的前面:
3)一個二進制Collation使用字元的數值為他們排序: