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.25、mysql 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 collation 和 php 需要使用 utf8mb4 字符集,而不是 utf8。
在 php 方面,我只是告诉 mysqli 连接使用 utf8mb4 字符集($somemysqliconn->set_charset("utf8mb4")
),而不是使用标头元元素。或者,您也可以使用header('Content-Type: text/html; charset=utf8mb4')
。
【讨论】:
以上是关于mysql 查询中的文本是不是可能不遵守排序规则?的主要内容,如果未能解决你的问题,请参考以下文章
由于某种原因,ProxySQL 查询缓存并不总是遵守查询规则