MySQL 8 0 字串比較特殊案例小結

2022-05-26 05:42:10 字數 1769 閱讀 6544

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會有數字代表著其字符集標準的編號或標準的版本。

mbfor 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。樣例輸入 ...