字元集、定序
- 字元集就是 字形符號+對應的編碼 的 集合
- 定序就是 如何理解和處理排序
mysql自覺其對字元集和定序的處理問題領先於其他資料庫系統
基本特性:
- 分層:server、database、table、column、文字常量
- 分層:server、client
- 分層:系統設定檔、系統變數、子句
- 功能簡單:每一級對下一級僅僅是起預設設定的作用,no other purpose
- 靈活:隨時、隨機 可以修改
- 支援豐富:
- 智能:不用擔心出錯!
基本命令和變數
- 命令:{show character set|show charaet} show collation;
- 變數:character_set_server collation_server、character_set_database collation_database、character_set_connection collation_connection、character_Set_client 、character_set_results、character_set_system
- 選項:--character-set-server --collation-server
注意
- 文字常量的預設字元集和定序是相關串連connection變數設定的。可以通過 [_character set name]'字元序列' [collation name] 修改,注意有個 "_"!
- 另外文字常量中的 逸出字元總是connection串連變數指定的字元集中的"\x",意思是:如果指定的文字常量的字元集和串連級字元集設定如果不一致,逸出字元會使用串連級字元集中的對應逸出字元的encode!不過僅僅當connection字元集為latin??????還有只是認為逸出字元的endcode必須是單一位元組字元集"\"???或者說:逸出字元"\"在某些字元集下根本是無效的?
- nchar:本質上是ansisql標準中的char中的一個具有預先定義的字元集屬性的特例而已
- unicode是character set ucs2的別名
- 字元集 和 定序 是相關聯的。除非特殊需求,只要設定其一即可。設定字元集,即設定了預設的定序;設定定序,就肯定設定了其關聯的字元集
方便的設定字元集
- set names 'character_set_name' [collate collation_name] 相當於下面的操作:
- set character_set_clent='character_set_name'
- set character_set_connection='character_set_name'
- set character_set_results='character_set_name'
- set character set 'character_set name' 相當於下面的操作:
- set character_set_clent='character_set_name'
- set collation_connection=collation_database --這一點和set names 不同
- set character_set_results='character_set_name'
使用mysql.exe內建用戶端程式的字元集設定
- 選項檔案配置:default-character-set
- 命令列參數:--default-character-set
- 命令:set names
- 命令:set character set
- 命令:charset --和set names 類似,但是影響以後的reconnnect
- 如果讓server發出的資訊、結果集不進行任何字元集轉換:set character_set_results={null|binary}
- ucs2字元集不能應用於character_set_client,如果你設定了,他不起任何作用
- 查詢當前設定:show variables like ‘’
對於其他用戶端環境
- 你必須要考慮應用程式所處的執行環境:是否支援字元集,字元集是否相容,有無相關的配置或初始化字元集動作等等!
如果讓server發出的資訊、結果集不進行任何字元集轉換:set character_set_results={null|binary},這個時候結果的字元集是有character_set_system系統變數決定的
mysql的中繼資料 是utf8字元集編碼的
定序
- 對於比較、排序、運算式來說,定序有著重要而靈活的應用。他幾乎可以用在sql語句的任何部分
- binary 'str' 和 cast('str' as binary)完全相同
- binary(m) = char(m) character set binary【<>char(m) binary】。該文法是定義二進位類型的一種形式。使用於所有文本類型。注意後面是欄位屬性:表示使用字元集的 二進位定序
- 特殊的binary定序模式 和 _bin定序,二者是不相同的
- 單位不同:位元組單位 和 字元編碼單位
- 字元集轉換:無 和 有
- 對某些函數的影響lower()...:有 和 無
- 比較時是否考慮尾隨空格:考慮 和 不考慮
- 插入 和 擷取是尾隨空格的處理:char(m)或右填充空格,但擷取是trim掉;而binary(m)或右填充0x00,擷取是保留
- 字元集和定序的壓縮性
- unicode字元集 和 非unicode字元集,總是轉換非 unicode字元集 到unicode字元集
- 同一個字元集下的"_bin"、"_cs"、"_ci"字元集混雜時,總是應用"_bin"的定序
- 如果可壓縮性形同,字元集相同,又不屬於以上情況(定序為"_cs"、"_ci"),哈哈哈,你死了!
- 越小越高越穩定:
- 0:collate子句
- 1:兩個不同定序的字串串連
- 2:表列、儲存程式、本地變數
- 3:系統常量、系統函數
- 4:文本常量的定序
- 5:null
- 字元集中字元的包容性:ascii是安全的
- 字元集對模型操作、函數的影響
- 簡單函數的輸出字元資料的字元集、定序和輸入參數的完全相同:instr、mid、substring、lower、lcase、ucase、upper、left、right、ltrim、rtrim、trim、reverse、repea、rpad、soundex,特殊的replace總是大小寫敏感的
- charset()、collation()函數返回字串的字元集、定序
- 對於多個輸入,一個輸出的函數:
- 如果有一個collate子句,就是他了
- 如果有2或更多個collate子句,恭喜,你死了
- 如果collation 都相同,就用它
- 其他,binary
顯示字元集轉換
- convert('str' using character_set_name) --ansi sql標準
- cast('str' as 字元資料類型 character set character_set_name)
- cast('str' as 字元資料類型 ) collate collation_name