我在写一个查询条件时的问题如下:
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字符集的基本概念 字符集(Character Set)定义了数据在存储和处理时所采用的编码标准,而校对集(Collation)则规定了字符集下的排序规则和比较方式。在MySQL中,主要涉及以下几个关键变量: - `...
### MySQL字符集与乱码问题解析 在MySQL数据库管理中,字符集的配置与使用是十分重要的环节之一,尤其在处理多语言环境的数据时更是如此。如果字符集配置不当,很容易导致数据插入、查询过程中出现乱码问题。本文将...
### 精通MySQL字符集与校对集 在MySQL中,正确地管理和配置字符集与校对集对于确保数据的正确性和一致性至关重要。字符集主要用于定义如何存储和表示文本数据,而校对集则定义了如何比较这些文本数据。本篇文章将...
以下将详细讲解MySQL字符集的概念、设置方法以及在实际应用中可能出现的问题和解决方案。 1. **字符集概念**: - **字符集(Character Set)**:是一系列字符的集合,例如ASCII、GBK、UTF-8等,定义了字符的编码...
MySQL字符集设置原理及其常见问题解决是数据库管理中不可或缺的一部分,尤其对于处理多语言或特殊字符的数据时,正确的字符集配置至关重要。字符集定义了数据库、表和字段能存储的字符范围,它决定了数据的编码和...
通过合理设置 MySQL 的字符集,可以有效避免因字符集不匹配导致的乱码问题。具体而言,需要注意客户端和服务端之间的字符集设置、创建表时的字符集选择以及数据插入和查询时的字符集处理等几个方面。希望本文能帮助...
MySQL查询字符集不匹配问题通常出现在数据库、数据表或字段的字符集与应用程序(如网页)使用的字符集不一致时,导致数据无法正确存储或检索,尤其是涉及非ASCII字符(如中文)时。本篇文章将深入探讨这个问题,并...
MySQL字符集问题一直以来都是数据库管理中的一个痛点,尤其是在处理多语言数据或者进行数据迁移时,不恰当的字符集设置可能导致乱码、无法存储特殊字符甚至数据丢失。这篇文档将深入探讨MySQL字符集的工作原理,常见...
2. **MySQL字符集转换**:在MySQL中,可以使用ALTER TABLE语句来更改表的字符集,或者在创建数据库、表或列时指定字符集。对于整个数据库的转换,需要备份现有数据,然后重建数据库并导入数据。过程中要特别注意数据...
MySQL字符集是数据库管理系统中处理文本数据的关键组件,它决定了数据如何被编码、存储和检索。MySQL 5.6.21版本支持多种字符集,这些字符集可以通过查询`information_schema`库中的`character_sets`表来查看。`...
合理设置这些变量可以避免因字符集不匹配导致的数据乱码等问题。例如,确保`character_set_client`、`character_set_connection`和`character_set_results`之间的一致性是非常重要的,这样可以确保从客户端输入到...
6. **数据导入导出**:在导入或导出数据时,要确保文件编码与数据库的字符集匹配,如果不匹配,可以使用工具如`iconv`进行转换。 7. **查看并调整系统级字符集**:检查系统环境变量,如`LC_ALL`或`LANG`,确保它们...
#### 一、MySQL字符集与校对序概述 在MySQL中,字符集和校对序是非常重要的概念。字符集(character set)定义了一组字符及其对应的二进制编码方式,而校对序(collation)则是用来定义字符比较规则的一组规则。...
10. **数据库迁移**:在数据库迁移或升级过程中,也要注意字符集的兼容性和转换,避免因字符集不匹配引发乱码问题。 总之,解决MySQL中的汉字乱码问题需要从多个层面进行检查和调整,确保字符集在整个数据处理链路...
MySQL中的字符集问题是一个常见的数据库管理挑战,尤其是在处理多语言数据或者进行跨系统数据迁移时。在本案例中,问题的核心在于两个表之间的字段字符集不兼容,导致了"非法的混合排序规则"(Illegal mix of ...
处理中文乱码问题通常涉及到确保客户端、服务器以及数据存储之间的字符集匹配。例如,如果服务器和客户端均设置为`GB2312`,则中文字符能正确传输。若要支持多国语言,推荐使用`UTF8`,因为它包含更广泛的字符集。 ...
1. **MySQL服务器端的字符集设置**:默认情况下,MySQL服务器可能设置为不同的字符集(如latin1),而这种字符集不支持中文。 2. **客户端的字符集设置**:客户端(如Delphi应用程序)可能也设置了特定的字符集,...
解决MySQL连接时中文显示乱码的问题,关键在于确保数据库、连接参数以及应用程序内部各环节的字符集设置保持一致,并采用适合中文字符的编码方式,如UTF-8。通过上述步骤,可以有效避免中文乱码现象,保证数据的正确...
当MySQL处理中文字符时,如果当前使用的字符集与数据的实际字符集不一致,就会出现乱码。 #### 二、检查系统及数据库的字符集设置 首先需要确认服务器和数据库的字符集设置是否正确。可以通过以下SQL命令来查看: ...