作者: falcon 发表日期: 2006-04-15 16:07
复制链接
引言:
在执行mysql的模糊查询操作时,发现返回的结果不准确,可至今没有找到完善的解决方案,所以特地来寻求解决方案拉.
问题:
我在命令行里头直接使用mysql(版本为mysql-4.0.18-win.zip)的时候也出现同样问题:
===================================
我有一个表里头存放了一些文件信息,包括中文的非中文的;
表名为file_tab,里头的重要字段是file,存放文件名,另外该字段的类型是char
我想查找包含"新鲜"这个词语的所有文件
理所当然的就用了
select file from file_tab where file like '%新鲜%'
执行后返回的结果却包含了其他信息,如下:
李湘给我新鲜
凯瑞·路易斯·托马斯&克利斯·马顿-水晶头骨之谜
刘易斯·托马斯-水母与蜗牛
刘易斯·托马斯-细胞生命的礼赞
托马斯-细胞生命的礼赞
[刘易斯·托马斯] 科学的危险
[柳文扬] 托马斯叔叔的推荐信
08.新鲜
结果明显不符合我的本来用意
自己分析:有可能是mysql对中文的处理问题,也许其他文件名里头的信息对应字节信息和"新鲜"对应的字节信息存在匹配关系,所以才得到这样不符合本来要求的结果,可是我找不到解决办法.
后来我以为是mysql的版本太低,从贵站下了msyql5.0.18,可是输出结果同样不准确,所以无奈
麻烦大家一起探讨/
详细见:http://bbs.mysql.cn/thread-633-1-1.html
解决办法:
解决问题本身
如果你定义该字段类型为char型,请用alter添加约束binary;
针对我上面的问题,解决方案如下:
先用describe file_tab查看该表的数据结构,然后通过下面的语句进行修改
alter table file_tab modify file char(100) binary not null;
[注:其中char(100) not null为原来的类型或约束,binary为添加的约束]
补充,如果你定义的字段类型为其他类型,遇到类似问题,可能也是没有加binary的缘故,试试就知道,呵呵
不过到底还是不知道为什么要用binary哦
所以我有去网路上找了一下,在百度里头输入mysql binary
先是找到《mysql中文参考手册》(用编辑>查找>binary,看看其作用)
http://www.yesky.com/imagesnew/software/mysql/manual_Compatibility.html
里头介绍了binary的作用:
缺省地,所有的字符串比较是忽略大小写的,由当前的字符集决定了(缺省为ISO-8859-1 Latin1)排序顺序。如果你不喜欢这样,你应该用BINARY属性或使用BINARY强制符声明列,它导致根据MySQL服务器主机的ASCII顺序进行排序。
后来竟然找到和我问题一样的东东:
《MySQL中文模糊检索问题的解决方法》
http://down.dl.net.cn/Article.asp?id=605
我的天啊,竟然有这么详细的解决办法
解决附带问题,实现不区分大小写查询
但是仔细一看,用binary后,竟然区分大小写拉
因此在查找的时候很不方便
那么我们该怎么办呢?
上面的文章中提到了解决办法,但在文末尾提到了这样会影响一些速度
那怎么尽量消除这个解决办法带来的的速度的影响呢?
这样子:
我们在添加数据进入表之前把该字段的所有数据全部该成小写,然后在查询的时候把输入的关键字也转换成小写的,那么问题不是解决拉,呵呵
具体可以这么做:
update file_tab set file=lcase(file);
然后查询的时候,改成
我们先设传进来的参数为$filename
那么可以这么做:
select file from file_tab where file like '%lcase($filename)%'
到现在,问题基本上完善解决拉