ref:ref:
ref:
paddingspace:指的是mysql在某些場景下對字串的padding部分用空格0x20 填充的方法
-- padding space example
mysql> select 'a' = 'a ', 'a' like 'a ';
+------------+---------------+
| 'a' = 'a ' | 'a' like 'a ' |
+------------+---------------+
| 1 | 0 |
+------------+---------------+
-- 注意:like永遠是按字元比較,因此paddingspace和特殊拉丁字母拆寫('ä' = 'ae')的規則都不適用於like計算。
一些影響字串比較的因素
以下實現的時候是每個字符集自己的實現,基本都是用大陣列來提前存好大小寫的對映關係。
ci
(case insensitive),大小寫不敏感。對應相反的是cs
。
特殊拉丁字母拆寫('ä' = 'ae'),目前僅出現在latin1中,僅有如下實現。也是用兩個combo陣列實現他們的指向關係。
-- refer to ctype-latin1.cc
'ä' -> "ae"
'ö' -> "oe"
'ü' -> "ue"
'ß' -> "ss"
ai
(不是自增主鍵的那個ai) refers accent insensitivity. that is, there is no difference between e, è, é, ê and ë when sorting. 對應相反的是as
。
部分collation name會有數字代表著其字符集標準的編號或標準的版本。
mb
for multibytes,其中utf8是utf8mb3的別名,一般建議用更標準更全的utf8mb4。
比較規則
binary collation
這個判斷優先順序最高,當乙個字串為binary時,不存在空格填充。char定長型別用0x00填充。其他字串無論原來collation和char型別,與binary比較時所有空格填充導致的規則全部失效,就是除去0x00部分的字串裸比較。
非binary的char定長字串型別
所有與這種char比較都按paddingspace規則,不管比較欄位是什麼字串型別或collation(當然除了binary)。
varchar與varchar比較
就只是字串比較,無須贅述。
跨collation轉換:
utf8與非utf8:非utf8的會轉為utf8,並按utf8的字串的collation比較進行比較(包括ci、ai規則)mysql認為所有其他charset都是utf8的子集,cs_to_uni也是用陣列對映方式實現的。(utf16和utf32轉utf8會丟失資訊)。
兩個非utf8的不同collation比較有可能會報錯不支援。
轉換相關**在 my_charset_handler的mb_wc函式和mbcharlen函式。mb_wc用來轉換,mbcharlen判斷原始編碼的位元組長度,比較特殊的是utf8mb3是1~3位元組變長的,因此每次都要呼叫charlen獲取長度。
16 字串比較函式
字串處理函式 strcmp s1,s2 可以比較兩個字串的大小,其字元的大小是以 ascii 碼表上的順序決定。該函式首先將 s1 第乙個字元值減去 s2 的第乙個字元值,若差值為 0 則繼續比較對應的下乙個字母,若不為 0 則該差值就是函式的最終結果。請按照該函式的實現原理,寫出乙個新的字串比較函...
6 8 字串04 比較字串(10 分)
c語言標準函式庫中包括 strcmp 函式,用於字串的比較。作為練習,我們自己編寫乙個功能與之相同的函式。函式原型 比較字串 int strcmp const char str1,const char str2 說明 str1 和 str2 分別為兩個字串的起始位址。按字典排序法,若 str1 串值...
1429 字串比較 多例項
題目描述 比較字串大小,但比較的規則不同字典序規則。字元比較新規則如下 a a b b z z。輸入輸入資料報含多個測試例項,每個測試例項佔兩行,每一行有乙個字串 只包含大小寫字母,長度小於10000 輸出如果第乙個字串小於第二個,輸出yes,否則,輸出no。注意 a a b b z z。樣例輸入 ...