7

这可能很简单。我发誓我一直在网上寻找答案,但没有找到。由于我的特殊情况有点不典型,我最终决定在这里问。

我在 MySQL 中有一些用于中文程序的表。它需要能够支持所有可能的汉字,包括那些没有很好的字体支持的稀有汉字。表中的示例单元格可能是这样的:

东菄鸫䍶倲涷蝀冻鯟崠埬䰤</p>

为了让它在数据库中正常工作,我不得不将编码/排序规则设置为 utf8mb4。到现在为止还挺好。不幸的是,当我将相同的字符串拉入 PHP 时,它会打印为:

东菄鸫䍶?倲??涷蝀冻鯟?崠埬?䰤</p>

我怎样才能最终消除剩余的问号并让它们显示为它们应该是的 unicode 字形?我已经在标签中使用 UTF8 编码并作为元标签来获取 php 页面本身。

为什么他们不能互相交流?我究竟做错了什么?

4

2 回答 2

15

我只是猜测您将表设置为utf8mb4,但您的连接编码设置为utf8. 您也必须将其设置utf8mb4为,否则 MySQL 会将存储的utf8mb4数据转换为utf8,后者无法编码“高”Unicode 字符。(是的,这是 MySQL 的特性。)

在原始 MySQL 连接上,它必须如下所示:

SET NAMES 'utf8mb4';
SELECT * FROM `my_table`;

您必须将其调整为客户端的最佳方式,具体取决于您如何从 PHP(mysql、mysqli 或 PDO)连接到 MySQL。


要真正澄清(是的,mysql_为了简单起见,使用扩展名,不要在家里这样做):

mysql_connect(...);
mysql_select_db(...);
mysql_set_charset('utf8mb4');     // adapt to your mysql connector of choice

$r = mysql_query('SELECT * FROM `my_table`');

var_dump(mysql_fetch_assoc($r));  // data will be UTF8 encoded
于 2012-10-23T14:03:36.930 回答
3

只是为了添加到@deceze 的答案,我推荐一个配置良好的 MySQL 服务器(对我来说,在/etc/mysql/mysql.conf.d/mysqld.cnf)。以下是确保您正在使用的配置选项utfmb4,尽管我确实建议您检查每个 MySQL 配置选项,尽管令人生畏,但有很多默认值非常不理想。

[client]

default-character-set           = utf8mb4

[mysql]

default_character_set           = utf8mb4

[mysqld]

init-connect                    = "SET NAMES utf8mb4"
character-set-client-handshake  = FALSE
character-set-server            = "utf8mb4"
collation-server                = "utf8mb4_unicode_ci"
autocommit                      = 1
block_encryption_mode           = "aes-256-cbc"

最后一个只是应该默认的。此外,init-connect处理不必每次都执行的问题。保持代码干净。现在运行:

SHOW VARIABLES WHERE Variable_name LIKE 'character\_set\_%' OR Variable_name LIKE 'collation%';

您应该返回如下内容:

+--------------------------+--------------------+
| Variable_name            | Value              |
+--------------------------+--------------------+
| character_set_client     | utf8mb4            |
| character_set_connection | utf8mb4            |
| character_set_database   | utf8mb4            |
| character_set_filesystem | binary             |
| character_set_results    | utf8mb4            |
| character_set_server     | utf8mb4            |
| character_set_system     | utf8               |
| collation_connection     | utf8mb4_unicode_ci |
| collation_database       | utf8mb4_unicode_ci |
| collation_server         | utf8mb4_unicode_ci |
+--------------------------+--------------------+

看起来你已经这样做了,但明确定义表创建并没有什么坏处:

CREATE TABLE `mysql_table` (
  `mysql_column` BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT,
  PRIMARY KEY (`mysql_column`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8mb4;

希望这可以帮助某人。

于 2016-10-17T06:37:33.053 回答