mysql 查询中的文本是不是可能不遵守排序规则?

Posted

技术标签:

【中文标题】mysql 查询中的文本是不是可能不遵守排序规则?【英文标题】:Is It Possible for Text in a mysql Query to Not Honor Collation?mysql 查询中的文本是否可能不遵守排序规则? 【发布时间】:2017-10-09 18:26:54 【问题描述】:

我已经看到了关于这个主题的几个问题,但这里是长篇大论的短篇:我在 phpmyadmin 中创建了一个使用 utf8_general_ci 排序规则的数据库,并且某些表中的行可以包含英文或日文文本。我正在使用 php mysqli 查询显示这些行,但从中得到了乱码。

我所做的工作包括以下内容:

html 标头的字符集添加元标记meta http-equiv="Content-Type" content="text/html; charset=UTF8"

通过set_charset() 明确告诉mysqli 连接使用UTF-8,并使用character_set_name() 进行健全性检查

验证数据库/相关表/列的排序规则

添加一些与任何 mysql 查询无关的日语文本,以验证浏览器是否可以呈现它

确保 php 文件采用 UTF-8 编码

验证日文输入是否正确输入到数据库和 php 中

使用 utf8_general_ci 排序规则使用可比较的测试数据库检查数据库的完整性(如果问题 db/table/column 最初是使用不同的排序规则产生的,并且更改它会导致现有行出现乱码)

验证information_schema表中的数据库排序规则和charset,使得charset为utf8,排序规则为utf8_general_ci

在mysqli查询中尝试将相关列转换为utf8(这样喜欢抛出错误,所以看起来无效)

以上所有检查结果我仍然胡言乱语,因此我询问查询中返回的行是否有可能与 db/table/column 的排序规则不匹配导致它被呈现不正确。

为了完整起见,这是在 wampserver3 部署中使用 php 5.6.25mysql 5.7.14 完成的phpmyadmin 4.6.4。可以取英文或日文的栏目设置为TEXT类型。

我完全被这个难住了。

【问题讨论】:

您确定该字体支持日文字符吗?另外,您能否展示一下“胡言乱语”的外观? 您可能会发现在 SQL 查询中使用HEX(column) 来确定列是否包含您认为它包含的字符很有帮助。 edit 你的问题可能对你有意义,以展示其中的一些内容。另外,我可以挂件吗?这是一个关于字符集的问题,而不是排序规则。 有5种不同类型的乱码;你有哪个?请参阅this 以诊断您的问题。 当你得到HEX时,你应该看到一个由3个字节组成的字符组:E381yy代表平假名,E383yy代表片假名,或者EAB0yy-ED9Eyy。汉字将是其他Exyyzz 【参考方案1】:

首先,感谢您的总体回复,其次,很抱歉我未能回答大家的问题以提供帮助。当天晚些时候提出最初的问题,然后就去睡觉了。我最终发现正在发生。

事实证明,mysql 的 UTF8 排序规则(utf8_general_ci、unicode_ci 等)并没有真正支持所有可能的字符代码 - 每个 @987654321 只有大约 6% @ (以及如何通过 my.cnf 更改底层 mysql 客户端/服务器和 mysqld 配置,如果使用 X/LAMP。wampserver,就像我的情况一样,需要以类似方式修改 mysql 的 my.ini)。长短之短:mysql collat​​ion 和 php 需要使用 utf8mb4 字符集,而不是 utf8。

在 php 方面,我只是告诉 mysqli 连接使用 utf8mb4 字符集($somemysqliconn->set_charset("utf8mb4")),而不是使用标头元元素。或者,您也可以使用header('Content-Type: text/html; charset=utf8mb4')

【讨论】:

以上是关于mysql 查询中的文本是不是可能不遵守排序规则?的主要内容,如果未能解决你的问题,请参考以下文章

由于某种原因,ProxySQL 查询缓存并不总是遵守查询规则

MYSQL数据库表排序规则不一致导致联表查询,索引不起作用问题

导入时不遵守默认数据库排序规则

Mysql 表排序规则改变

mysql查询时不区分大小写

Mysql 查询以发现当前的默认数据库排序规则(通过命令行客户端)