MySQL 中文模糊查询不正确问题解决方案

转自:http://blog.csdn.net/wangzhi_821/article/details/5008899

我在开发过程中发现 MySQL 进行数据查询时存在一些问题.
    如模糊查询一个字段,该字段中包含"了"字, SQL 语句如下:
        select * from table_name where field_name like '%了%'; 
显示的记录中除了包含"了"字的记录,连"见浪"竞然也被查了出来.
    再如:我查询一个字段等于 "chouY", SQL 语句如下:
        select * from table_name where field_name='chouY';
结果中竟然还有 "Chouy".这是为何呢?
    经过在网上的查找, 找到了原因: 在 MySQL 中, 进行中文排序和查找的时候, 对汉字的排序和查找结果是错误的. 出现这个问题的原因是: MySQL 在查询字符串时是大小写不敏感的, 在编绎 MySQL 时一般以 ISO-8859 字符集作为默认的字符集, 因此在比较过程中中文编码字符大小写转换造成了这种现象. 
    在网上也找到了几种解决方法:
     方法一 :
 解决方法是对于包含中文的字段加上 "binary" 属性, 使之作为二进制比较, 例如将 "name char(10)" 改成 "name char(10)binary". 
     方法二 : 
   如果你使用源码编译 MySQL, 可以编译 MySQL 时使用 --with-charset=gbk 参数,这样 MySQL 就会直接支持中文查找和排序了。 
     方法三 : 
   可以使用 Mysql 的 locate() 函数来判断。以上述问题为例,使用方法为: 
       SELECT * FROM table_name WHERE locate(field_name,'了') > 0; 
     方法四 : 
    把您的 select 语句改成这样:
       SELECT * FROM table_name WHERE field_name LIKE BINARY '%了%';
     方法五 :
    你可以修改 my.ini (Linux 下为 my.conf)文件,找到 default-character-set 属性,反把其值设为 gbk; 或者在启动 mysqld-nt (Linux 下为 mysqld)时加上启动参数 --default-character-set=gbk, 这样也能解决问题.
    以上的方法我只试验了第四种和第五种方法, 其它的并没有验证. 第四种方法能解决这两个问题; 第五种方法只能解决第一个中文问题, 但对数据库中已有的中文数据会产生问题.

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在使用PHP进行MySQL模糊查询时,有时候可能会出现漏数据的情况。这往往是由于模糊查询的匹配规则导致的。为了解决这个问题,可以考虑以下几个解决办法: 1. 使用LIKE语句时,确保正确设置通配符:%和_。 - `%`:表示匹配任意多个字符。 - `_`:表示匹配单个字符。 确保在查询中正确使用这些通配符,以确保匹配到所有符合条件的数据。 2. 使用正则表达式进行模糊查询。 在MySQL中,可以使用REGEXP关键字进行正则表达式匹配。通过编写准确的正则表达式模式,可以更精确地匹配需要的数据。 3. 考虑使用全文搜索引擎。 MySQL提供了全文搜索功能,可以更高效地进行模糊查询。通过创建全文索引,并使用MATCH AGAINST语句进行查询,可以提高搜索的准确性和效率。 4. 使用索引优化查询性能。 确保在模糊查询的字段上创建适当的索引,以提高查询性能。使用索引可以加快查询速度并减少漏数据的可能性。 5. 仔细选择匹配算法。 MySQL提供了多种匹配算法(如LIKE、RLIKE、REGEXP等),根据具体需求选择合适的算法进行查询。不同的算法有不同的匹配规则,选择合适的算法可以更好地满足查询要求。 通过结合以上几个方法,你可以提高模糊查询的准确性和完整性,减少漏数据的情况发生。根据具体情况选择合适的解决办法,并进行适当的优化,以获得更好的查询结果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值