作者: falcon 發(fā)表日期: 2006-04-15 16:07
復(fù)制鏈接
引言:
在執(zhí)行mysql的模糊查詢操作時(shí),發(fā)現(xiàn)返回的結(jié)果不準(zhǔn)確,可至今沒(méi)有找到完善的解決方案,所以特地來(lái)尋求解決方案拉.
問(wèn)題:
我在命令行里頭直接使用mysql(版本為mysql-4.0.18-win.zip)的時(shí)候也出現(xiàn)同樣問(wèn)題:
===================================
我有一個(gè)表里頭存放了一些文件信息,包括中文的非中文的;
表名為file_tab,里頭的重要字段是file,存放文件名,另外該字段的類(lèi)型是char
我想查找包含"新鮮"這個(gè)詞語(yǔ)的所有文件
理所當(dāng)然的就用了
select file from file_tab where file like '%新鮮%'
執(zhí)行后返回的結(jié)果卻包含了其他信息,如下:
李湘給我新鮮
凱瑞·路易斯·托馬斯&克利斯·馬頓-水晶頭骨之謎
劉易斯·托馬斯-水母與蝸牛
劉易斯·托馬斯-細(xì)胞生命的禮贊
托馬斯-細(xì)胞生命的禮贊
[劉易斯·托馬斯] 科學(xué)的危險(xiǎn)
[柳文揚(yáng)] 托馬斯叔叔的推薦信
08.新鮮
結(jié)果明顯不符合我的本來(lái)用意
自己分析:有可能是mysql對(duì)中文的處理問(wèn)題,也許其他文件名里頭的信息對(duì)應(yīng)字節(jié)信息和"新鮮"對(duì)應(yīng)的字節(jié)信息存在匹配關(guān)系,所以才得到這樣不符合本來(lái)要求的結(jié)果,可是我找不到解決辦法.
后來(lái)我以為是mysql的版本太低,從貴站下了msyql5.0.18,可是輸出結(jié)果同樣不準(zhǔn)確,所以無(wú)奈
麻煩大家一起探討/
詳細(xì)見(jiàn):http://bbs.mysql.cn/thread-633-1-1.html
解決辦法:
解決問(wèn)題本身
如果你定義該字段類(lèi)型為char型,請(qǐng)用alter添加約束binary;
針對(duì)我上面的問(wèn)題,解決方案如下:
先用describe file_tab查看該表的數(shù)據(jù)結(jié)構(gòu),然后通過(guò)下面的語(yǔ)句進(jìn)行修改
alter table file_tab modify file char(100) binary not null;
[注:其中char(100) not null為原來(lái)的類(lèi)型或約束,binary為添加的約束]
補(bǔ)充,如果你定義的字段類(lèi)型為其他類(lèi)型,遇到類(lèi)似問(wèn)題,可能也是沒(méi)有加binary的緣故,試試就知道,呵呵
不過(guò)到底還是不知道為什么要用binary哦
所以我有去網(wǎng)路上找了一下,在百度里頭輸入mysql binary
先是找到《mysql中文參考手冊(cè)》(用編輯>查找>binary,看看其作用)
http://www.yesky.com/imagesnew/software/mysql/manual_Compatibility.html
里頭介紹了binary的作用:
缺省地,所有的字符串比較是忽略大小寫(xiě)的,由當(dāng)前的字符集決定了(缺省為ISO-8859-1 Latin1)排序順序。如果你不喜歡這樣,你應(yīng)該用BINARY屬性或使用BINARY強(qiáng)制符聲明列,它導(dǎo)致根據(jù)MySQL服務(wù)器主機(jī)的ASCII順序進(jìn)行排序。
后來(lái)竟然找到和我問(wèn)題一樣的東東:
《MySQL中文模糊檢索問(wèn)題的解決方法》
http://down.dl.net.cn/Article.asp?id=605
我的天啊,竟然有這么詳細(xì)的解決辦法
解決附帶問(wèn)題,實(shí)現(xiàn)不區(qū)分大小寫(xiě)查詢
但是仔細(xì)一看,用binary后,竟然區(qū)分大小寫(xiě)拉
因此在查找的時(shí)候很不方便
那么我們?cè)撛趺崔k呢?
上面的文章中提到了解決辦法,但在文末尾提到了這樣會(huì)影響一些速度
那怎么盡量消除這個(gè)解決辦法帶來(lái)的的速度的影響呢?
這樣子:
我們?cè)谔砑訑?shù)據(jù)進(jìn)入表之前把該字段的所有數(shù)據(jù)全部該成小寫(xiě),然后在查詢的時(shí)候把輸入的關(guān)鍵字也轉(zhuǎn)換成小寫(xiě)的,那么問(wèn)題不是解決拉,呵呵
具體可以這么做:
update file_tab set file=lcase(file);
然后查詢的時(shí)候,改成
我們先設(shè)傳進(jìn)來(lái)的參數(shù)為$filename
那么可以這么做:
select file from file_tab where file like '%lcase($filename)%'
到現(xiàn)在,問(wèn)題基本上完善解決拉