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

标签 php mysql utf-8 phpmyadmin wampserver

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

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

  • 为 HTML header 的字符集添加元标记
    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 表中的数据库排序规则和字符集,字符集为 utf8,排序规则为 utf8_general_ci

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

以上所有检查结果仍然是乱码,因此我问一个问题,查询中返回的行是否可能与数据库/表/列的排序规则不匹配导致它被渲染不正确。

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

我完全被这个难住了。

最佳答案

首先,感谢您的总体答复,其次,对于我在尝试提供帮助时未能对每个人的问题作出答复感到抱歉。当天晚些时候提出最初的问题,然后就去 sleep 了。我最终发现事情正在发生。

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

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

关于php - mysql 查询中的文本是否可能不遵守排序规则?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43903766/

相关文章:

mysql - 在 Laravel 中加入具有冲突列名的三个表

csv - 读取带有 CFFile 和非罗马字符的 CSV

java - Eclipse 调试器错误地显示 cjk 字符 - Java

javascript - PHP 回显 jQuery AJAX 请求

PHP 和 MySQL 函数返回

MySQL:今天之后的 WHERE 时间戳

MySQL:将列更改为 UTF8 时数据被破坏

javascript - 即使数据值不正确也无法显示正确的按钮

php - Elasticsearch地理位置搜索未返回英里单位的结果

java - 将选定的 Jtree 节点设置为 JTable