mysqli 没有将字符集设置为 utf8mb4

Cha*_*haz 5 php mysql encoding utf-8 utf8mb4

发现问题

问题似乎$mysqli->set_charset()是不接受 `utf8mb4' 作为有效编码(正如我在第一次更新中“推测”的那样)。MySQL 版本是 5.5.41,PHP 版本是 5.4.41(没问题)。


抱歉标题,我一直在搜索/阅读问题是什么/在哪里,我已经对此感到困惑......

我最近开始在 mysql 中使用 utf8mb4。我使用 utf8mb4 作为字符集,使用 utf8mb4_unicode_ci 作为所有表/列的排序规则。

所以我首先改变了:

$mysqli->set_charset('utf8');
Run Code Online (Sandbox Code Playgroud)

$mysqli->set_charset('utf8mb4');
Run Code Online (Sandbox Code Playgroud)

确保我的 php 文件是 utf8(我使用的是 Visual Studio Code,因此默认情况下这些文件是以 UTF-8 创建的),并且 php/html 标头设置为 utf8:

索引.php

header('Content-type: Text/HTML; Charset=UTF-8');
Run Code Online (Sandbox Code Playgroud)

main.php(包含在 index.php 的末尾)

<meta http-equiv="Content-Type" content="Text/HTML" />
<meta charset="UTF-8" />
Run Code Online (Sandbox Code Playgroud)

问题是对于某些表,我必须手动插入数据,并且这些数据按原样存储:带有特殊字符、重音符号、ñ 等......当我在我的网站上显示这些数据时,我可以看到这些字符?替换了特殊/重音字符。

所以我的问题是:有什么方法可以在 mysql 中按原样存储数据(不替换/转换特殊/重音字符)并能够正常显示(按原样)?

如果我恢复到$mysqli->set_charset('utf8');数据显示正常......所以这让我想知道存储utf-8字符应该没有问题,并且某处存在一些编码问题......

我正在使用 sqlyog 社区(带酒),我在某处读到,当您更改某些 db/table 配置时,gui 有时无法正常工作,唯一的方法是旧方法(自己运行查询),但我没有试过这个了。我运行查询来设置所有表/列的字符集和排序规则。

你怎么认为?

更新

我开始认为 mysqli 不接受 utf8mb4 作为有效的字符编码,而是使用来自 php 而不是来自 mysql 的 utf8 ......我还认为 mysql fckd 创建 utf8mb4 而不是更新现有的 utf8 以支持 4 个字节...... .

当我使用 mysqli 字符集 utf8 进行测试时,所有内容都按原样存储并按原样显示(mysql 字符集和排序规则设置为 utf8mb4...)。

更新 2

SELECT name, HEX(name) FROM person LIMIT 1
Run Code Online (Sandbox Code Playgroud)

这是它的输出:

New Person has name Altaïr 416C7461C3AF72
Run Code Online (Sandbox Code Playgroud)

但正如我已经说过的,这是使用:

$mysqli->set_charset('utf8');
Run Code Online (Sandbox Code Playgroud)

插入和选择。如果我使用 utf8mb4 代替,这就是它存储的内容:

Altaïr
Run Code Online (Sandbox Code Playgroud)

但是显示正常。它没有显示出来的是,如果名称按原样存储,则显示的名称将为Alta?r.

所以问题是:为什么 mysqli/mysql 存储ïï使用 utf8mb4?为什么是php显示特殊字符,如ï?当utf8mb4在mysqli的设置?

有人可以确认mysqli::set_charset接受 utf8mb4 作为有效编码吗?

更新 3

我有一个类函数,它从表“es”中选择一个字符串,例如:(Iniciar Sesión这是存储的内容),如果 mysqli 字符集是 utf8,则选择/显示的内容是Iniciar Sesión.

这可能是一个完全不同的问题,但显然是另一个编码问题。根据我的理解,如果表/列是 utf8mb4 并且 mysqli 设置为 utf8,则 mysql 必须从 utf8(3 字节)编码到 ut8mb4(全字节支持)。所以这意味着mysqli不使用来自 php 的 utf8,而是来自 mysql。这是正确的,对吗?

我的应用程序目前在编码方面遇到了困难......(但可能是一些服务器配置问题......)

更新 4

问题可能出在这里吗?我真的不知道这种配置:

SHOW VARIABLES WHERE Variable_name LIKE 'character\_set\_%' OR Variable_name LIKE 'collation%';
+--------------------------+--------------------+
| Variable_name            | Value              |
+--------------------------+--------------------+
| character_set_client     | utf8               |
| character_set_connection | utf8               |
| character_set_database   | utf8mb4            |
| character_set_filesystem | binary             |
| character_set_results    | utf8               |
| character_set_server     | latin1             |
| character_set_system     | utf8               |
| collation_connection     | utf8_general_ci    |
| collation_database       | utf8mb4_unicode_ci |
| collation_server         | latin1_swedish_ci  |
+--------------------------+--------------------+
10 rows in set (0.00 sec)
Run Code Online (Sandbox Code Playgroud)

更新 4-1/2 (从评论中复制)

CREATE TABLE `es` (
    id int(11) NOT NULL AUTO_INCREMENT, 
    name varchar(30) COLLATE utf8mb4_unicode_ci DEFAULT NULL, 
    text varchar(100) COLLATE utf8mb4_unicode_ci DEFAULT NULL, 
    PRIMARY KEY (id), 
    UNIQUE KEY name (name)
) ENGINE=InnoDB AUTO_INCREMENT=76 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci` 
Run Code Online (Sandbox Code Playgroud)

Cha*_*haz 0

谜团解开了!mysql 安装/升级/配置错误,并且 utf8mb4 未正确安装。

\n\n

该函数的问题在于它使用 utf8_encode() 重新编码 db 值,并且不知何故导致了这些字符\xc3\xb3-> \xc3\x83\xc2\xb3

\n