本文講述mysql使用like語句時,匹配查詢出不正確中文的解決辦法
mysql like 搜索的時候發現,用
select title from tb_name where title like '%a%'
的時候出來的結果除了包含a的名字外連包含中文“新”的名字也出現在搜索結果里面,這令我想弄清楚mysql的匹配模式和規則到底是怎么樣的,另外在匹配的時候正則表達式也很常用!
出現這個問題的原因是:MySQL在查詢字符串時是大小寫不敏感的,在編繹MySQL時一般以ISO-8859字符集作為默認的字符集,因此在比較過程中中文編碼字符大小寫轉換造成了這種現象。
解決辦法:
1.在建表的時候對於包含中文的字段加上“BINARY”屬性,使之進行二進制比較,例如講"name char(10)"改成"name char(10) BINARY"。但是這樣你對該表的該字段進行匹配的時候是區分大小寫的。
2.如果使用源碼編譯MySQL,可以在編譯的時候使用--with--charset=gbk參數,這樣mysql就直接支持中文查找和排序。
3.使用mysql的locate函數來判斷。如:
SELECT * FROM table WHERE locate(substr,str)>0 ;
locate()有兩個形式:LOCATE(substr,str), LOCATE(substr,str,pos)。返回substr在str中的位置,如果str不包含substr返回0。這個函數也是不區分大小寫的。
4.這樣使用sql語句:
SELECT * FROM TABLE WHERE FIELDS LIKE BINARY '%FIND%'
但是這和1一樣是區分大小寫的如果你想進行不區分大小寫的查詢的時候就要使用upper或者lower進行轉換。
5.使用binary和ucase函數及concat函數。ucase是講英文全部轉換大寫,concat對字符串進行連接。新的sql語句如下:
select id,title,name from achech_com.news where binary ucase(title) like concat('%',ucase('a'),'%')
也可以寫為
select id,title,name from achech_com.news where binary ucase(title) like ucase('%a%')
檢索的結果還算滿意吧,不過速度可能會因此而慢N毫秒喔。 因為使用like和%進行匹配的話對效率會有一定的影響。