`

mysql中文查询时的字符集匹配问题

阅读更多

我在写一个查询条件时的问题如下:
select * from table where field='中文';
显示的字段field 等于“中文”字的记录,可以除了出来字段field为“中文”之外,还出来字段field不等“中文”的记录,为什么?

搜索了网上的一些经验,我来修正下他们的一些经验。


在MySQL中,进行中文排序和查找的时候,对汉字的排序和查找结果是错误的。这种情况在MySQL的很多版本中都存在。如果这个问题不解决,那么MySQL将无法实际处理中文搜索,搜索结果不准确。

  出现这个问题的原因是:MySQL在查询字符串时是大小写不敏感的,在编绎MySQL时一般以ISO-8859字符集作为默认的字符集,因此在比较过程中中文编码字符大小写转换造成了这种现象。

方法一:(这种方法我没试过)

解决方法是对于包含中文的字段加上"binary"属性,使之作为二进制比较,例如将"name char(10)"改成"name char(10)binary"。

方法二:(这种方法根据mysql文档应该是可以使用)

  如果你使用源码编译MySQL可以编译MySQL时使用--with--charset=gbk 参数,这样MySQL就会直接支持中文查找和排序了。

方法三: (网上盛传这种方法,我在3.23.58版上并不可以)
   SELECT * FROM table WHERE locate( field,'中文') > 0;
这种方法比较慢,但实际这种方法我实践中并不可行的,但出现字段空的时候也匹配了。

LOCATE(substr,str,pos)
返回子串 substr 在字符串 str 中的第 pos 位置后第一次出现的位置。如果 substr 不在 str 中返回 0

我以下列出mysql locate方法使用中的一些结果:

 mysql> select  locate('sdfsfd','曦子',4);
+---------------------------+
| locate('sdfsfd','曦子',4) |
+---------------------------+
|                         0 |
+---------------------------+
1 row in set (0.00 sec)

mysql> select  locate('曦子','曦子',4);
+-------------------------+
| locate('曦子','曦子',4) |
+-------------------------+
|                       0 |
+-------------------------+
1 row in set (0.00 sec)

mysql> select  locate('曦子','曦子');
+-----------------------+
| locate('曦子','曦子') |
+-----------------------+
|                     1 |
+-----------------------+
1 row in set (0.00 sec)

mysql> select  locate('曦子','ss曦子');
+-------------------------+
| locate('曦子','ss曦子') |
+-------------------------+
|                       3 |
+-------------------------+
1 row in set (0.00 sec)

mysql> select  locate('','ss曦子');
+---------------------+
| locate('','ss曦子') |
+---------------------+
|                   1 |
+---------------------+
1 row in set (0.00 sec)

由以上结果可见,locate方法,对于字段为空的情况也匹配了。不可取,无论是在使用=或like 的情况都不可用

 

方法四:(个人认为如果你已经装好了mysql,应用也配置好,这种方法最好不过了,搜索速度几乎没有影响)

把您的Select语句改成这样,SELECT * FROM TABLE WHERE FIELDS LIKE BINARY '%FIND%'即可!

对不使用like的情况: SELECT * FROM TABLE WHERE FIELDS = BINARY 'searchStr';

分享到:
评论

相关推荐

    关于mysql查询字符集不匹配问题的解决方法

    主要给大家介绍了关于mysql查询字符集不匹配问题的解决方法,文中通过示例代码给大家介绍的非常详细,对同样遇到这个问题的朋友们具有一定的参考学习价值,需要的朋友们下面跟着小编来一起学习学习吧。

    mysql 字符集 乱码问题

    解决字符集通讯设置不匹配的方法: (修改默认的character_set_client,character_set_connection,character_set_result)

    MySql基本查询、连接查询、子查询、正则表达查询讲解

    如果字段的值与指定的字符串相匹配,则满足查询条件,该纪录将被查询出来。如果与指定的字符串不匹配,则不满足查询条件。其语法规则如下:[ NOT ] LIKE '字符串' “NOT”可选参数,加上 NOT表示与指定的字符串不...

    MySQL中文参考手册.chm

    9.1.1 用于数据和排序的字符集 9.1.2 增加一个新的字符集 9.1.3 多字节字符支持 9.2 更新日志 9.3 MySQL数据库表可以有多大? 9.4 MySQL数据库表类型 10 从 MySQL 得到最大的...

    MySQL 5.1参考手册中文版

    10.10. MySQL支持的字符集和校对 10.10.1. Unicode字符集 10.10.2. 西欧字符集 10.10.3. 中欧字符集 10.10.4. 南欧与中东字符集 10.10.5. 波罗的海字符集 10.10.6. 西里尔字符集 10.10.7. 亚洲字符集 11. 列...

    MySQL 5.1官方简体中文参考手册

    10.10. MySQL支持的字符集和校对 10.10.1. Unicode字符集 10.10.2. 西欧字符集 10.10.3. 中欧字符集 10.10.4. 南欧与中东字符集 10.10.5. 波罗的海字符集 10.10.6. 西里尔字符集 10.10.7. 亚洲字符集 11. 列类型 ...

    mysql5.1中文手册

    MySQL支持的字符集和校对 10.10.1. Unicode字符集 10.10.2. 西欧字符集 10.10.3. 中欧字符集 10.10.4. 南欧与中东字符集 10.10.5. 波罗的海字符集 10.10.6. 西里尔字符集 10.10.7. 亚洲字符集...

    MySQL 5.1参考手册 (中文版)

    10.10. MySQL支持的字符集和校对 10.10.1. Unicode字符集 10.10.2. 西欧字符集 10.10.3. 中欧字符集 10.10.4. 南欧与中东字符集 10.10.5. 波罗的海字符集 10.10.6. 西里尔字符集 10.10.7. 亚洲字符集 11. 列类型 ...

    MySQL中文参考手册

    + 4.15.2 启动 MySQL 服务器的问题 + 4.15.3 自动启动和停止 MySQL + 4.15.4 选项文件 o 4.16 升级和降级(downgrading)时有什么特别要做的事情吗? + 4.16.1 从一个 3.22 版本升级到 3.23 + 4.16.2 从一个 ...

    MYSQL中文手册

    10.10. MySQL支持的字符集和校对 10.10.1. Unicode字符集 10.10.2. 西欧字符集 10.10.3. 中欧字符集 10.10.4. 南欧与中东字符集 10.10.5. 波罗的海字符集 10.10.6. 西里尔字符集 10.10.7. 亚洲字符集 11. 列...

    MYSQL

    9.1.1 用于数据和排序的字符集 9.1.2 增加一个新的字符集 9.1.3 多字节字符支持 9.2 更新日志 9.3 MySQL数据库表可以有多大? 9.4 MySQL数据库表类型 10 从 MySQL 得到最大的性能 ...

    MySQL 5.1参考手册

    10.10. MySQL支持的字符集和校对 10.10.1. Unicode字符集 10.10.2. 西欧字符集 10.10.3. 中欧字符集 10.10.4. 南欧与中东字符集 10.10.5. 波罗的海字符集 10.10.6. 西里尔字符集 10.10.7. 亚洲字符集 11. 列类型 ...

    mysql官方中文参考手册

    10.10. MySQL支持的字符集和校对 10.10.1. Unicode字符集 10.10.2. 西欧字符集 10.10.3. 中欧字符集 10.10.4. 南欧与中东字符集 10.10.5. 波罗的海字符集 10.10.6. 西里尔字符集 10.10.7. 亚洲字符集 11. 列类型 ...

    mysql索引失效.docx MySQL索引失效是指在查询执行过程中,数据库无法有效地使用索引来提高查询性能

    多列索引的顺序问题:如果查询中的条件和多列索引的顺序不匹配,MySQL可能无法使用索引。多列索引按照定义的顺序进行匹配,如果查询不是按照相同的顺序来进进行查询,索引将无法有效使用。 查询范围过大:如果查询...

    MySQL5.1参考手册官方简体中文版

    10.10. MySQL支持的字符集和校对 10.10.1. Unicode字符集 10.10.2. 西欧字符集 10.10.3. 中欧字符集 10.10.4. 南欧与中东字符集 10.10.5. 波罗的海字符集 10.10.6. 西里尔字符集 10.10.7. 亚洲字符集 11. 列类型 ...

    MySql5中文乱码的解决方法

    在使用MYSQL时,插入中文字符,经常会出现乱码,中文全被用?...在MYSQL中,如果使用缺省的字符集,在建库、建表时,默认使用的是latin1字符集,为ISO 8859-1西欧字符集。插入中文字符时,与之不匹配,就会出现乱码。

    MySql数据库表操作:创建表、删除表、查看表、修改、查询表(详细)、设置表的字符编码

    5.3 带like的通配符匹配查询 5.4 空值查询 5.5 带AND的多条件查询 5.6 带OR的多条件插查询 5.7 去重复查询 5.8 对结果排序 5.9 分组查询 5.10 union合并查询 5.11 LIMIT分页查询 5.12 内连接查询和外连接查询 6 设置...

Global site tag (gtag.js) - Google Analytics