標籤:
3.1.2字串值
3.1.2.1字串類型與字元集支援
3.1.2.2字元集相關的系統變數
3.1.2.1字串類型與字元集支援
字串值一般可以分為兩類,二進位串和非二進位串
二進位串:一組位元組序列,沒有特殊的比較或者排序屬性. 比較操作是基於各位元組的數值逐個位元組實現的. 所有位元組都有意義,**甚至包括結尾的空格**. 非二進位串:一個字元序列,每個二進位串都與字元集相關. 字元集決定了:MySQL如何解釋字串內容,哪些字元可以用. 每個字元集都有一種或者多種定序. **尾部空格不會參與比較(TEXT類型除外-具有唯一性索引)**
字串所使用的定序決定了字元在字元集裡的先後順序,這會對比較操作產生影響.
預設的字元集和定序分別為latin1和latin_swedish_ci.
查看伺服器上提供的字元集以及定序:
show character set;+----------+-----------------------------+---------------------+--------+| Charset | Description | Default collation | Maxlen |+----------+-----------------------------+---------------------+--------+| big5 | Big5 Traditional Chinese | big5_chinese_ci | 2 || dec8 | DEC West European | dec8_swedish_ci | 1 || cp850 | DOS West European | cp850_general_ci | 1 || hp8 | HP West European | hp8_english_ci | 1 || koi8r | KOI8-R Relcom Russian | koi8r_general_ci | 1 |..............show 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 || cp850_general_ci | cp850 | 4 | Yes | Yes | 1 || cp850_bin | cp850 | 80 | | Yes | 1 |................
每種定序都捆綁在某個特定的字元集上,而每個給定的字元集可以有多種定序.
格式: 字元集名語言名附加尾碼
尾碼規則如下:
_ci表示定序不區分大小寫
_cs表示定序要區分大小寫
_bin表示這是一種二進位定序.(比較操作基於數字字元編碼值進行,與語言無關)
如:utf8_bin
二進位串和非二進位串的排序特性:
二: 逐位元組進行比較,結果只取決於每個位元組的數值大小,區分大小寫(大小寫不同,對應
位元組數值不同,二進位串其實並沒有大小寫概念區分大小寫實際上是定序的一項功能)
非二:按字元進行比較,每一個字元的相對值取決於當前所用字元集的定序.大小寫設定為同一排序值,所以不區分大小寫(不適用於區分大小寫非二進位排序)
確定某個字串的字元集和定序:
(預設情況下,MySQL會把十六進位常量當作二進位串對待)
select charset(x‘0123‘),collation(x‘0123‘);+------------------+--------------------+| charset(x‘0123‘) | collation(x‘0123‘) |+------------------+--------------------+| binary | binary |+------------------+--------------------+
有兩種記法約定可以用於將某個字串強制解釋為某種指定的字元集.
1._charset str
_latin2 ‘abc‘_latin2 x‘616263‘_latin2 0x616263_utf8 ‘def‘_utf8 X‘646566‘_utf8 0x646566
對於引號裡的字串: 字元集引導符與字串之間空白可選 十六進位不能留有任何空白
2.N’str’(等價於_utf8’str’)
N的後面必須緊跟一個引號形式的字串,不能有任何空白
(3.對於字串運算式或列值的引導符記法)
convert (str using charset);
引導符和convert是不一樣的,引導符只會改變對字串的解釋,不會改變值,而convert是一個函數,進入的是輸入參數,產生一個新的字串返回.
set @s1 = _ucs2 ‘ABCD‘;set @s2 = convert (‘ABCD‘ using ucs2);select char_length(@s1), length(@s1), char_length(@s2), length(@s2);+------------------+-------------+------------------+-------------+| char_length(@s1) | length(@s1) | char_length(@s2) | length(@s2) |+------------------+-------------+------------------+-------------+| 2 | 4 | 4 | 8 |+------------------+-------------+------------------+-------------+
第一條語句:把ABCD每一對字元解釋為一個雙位元組ucs2字元
第二條語句:把每個字元轉化為相應的ucs2字元.
這一節最後介紹了二進位串與使用二進位串定序的非二進位串的區別.
1.二進位串沒有字元集的概念.它會被解釋為位元組,並且比較的是單位元組的數字代碼
2.使用了二進位定序的非二進位串,會被解釋為字元,並且比較的是它們的數字字元值,這種值通常是基於每個字元多個位元組算出的.
set @s1 = binary ‘abcd‘;set @s2 = _latin1‘abcd‘ collate latin1_bin; select upper(@s1),upper(@s2);+------------+------------+| upper(@s1) | upper(@s2) |+------------+------------+| abcd | ABCD |+------------+------------+
二進位串根本沒有字元集的概念,所以無從得知哪些位元組值對應著大寫或者小寫字元.如果非要這麼做,可以選擇先 convert再使用upper lower函數.
3.1.2.2字元集相關的系統變數
這一小節pass 暫時並沒有什麼用 一切使用預設就好了
跟我一起學習MySQL技術內幕(第五版):(第三章學習日記2上)