天天看點

MySQL學習-字元串屬性

二進制字元串的比較是通過逐個位元組的比較位元組數值來進行的。二進制字元串不和字元集相關聯。

非二進制字元串是一個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使用字元的數值為他們排序:

繼續閱讀