处理混合的 utf8 和 utf8mb4 MYSQLI & PHP

Handling mixed utf8 and utf8mb4 MYSQLI & PHP

刚才,我运行遇到了一个我以前碰巧没有遇到过的问题:

为了在特定列中支持表情符号,我决定将我的 mysqli_set_charset() 设置为 utf8_mb4 以及我的数据库中的一些列编码。

现在,我 运行 遇到 PHP 的问题,实际上没有正确处理来自正常 utf8 编码字段的重音字符。

现在,我一直坚持混合 utf8utf8mb4 结果。由于我的数据处理能力不是很强(曾经使用为我处理所有数据的工作框架),所以我很不熟悉如何最好地解决这个问题。

我考虑过以下方案:

1 ) 将我的整个数据库设置为 utf8mb4 排序规则而不是 utf8 除了少数例外。

2 ) 使用 mysqli_set_charset() 来改变它,并简单地确保获取所述数据的查询是分开的

现在,这些对我来说都不是好主意,但我真的想不出更好的解决方案。

那么剩下的问题是:

我在这个问题上真的不知所措,老实说,我猜不出哪个选项是最好的。谷歌搜索它并没有太大帮助,因为它只返回解释它的差异或如何将你的数据库转换为 utf8mb4 的链接,所以我非常想听听其中一位智者对此的想法各位同事!

此特定案例中的列:

我的回复包括PHP的字符编码检测:

arri�n = UTF-8
bolsward = ASCII
go�nga = UTF-8
lo�nga = UTF-8
echt = ASCII
echteld = ASCII
echten (drenthe) = ASCII
echten (friesland) = ASCII
echtenerbrug = ASCII
echterbosch = ASCII

我的 MYSQLI 字符集: mysqli_set_charset($this->getConn(), "utf8mb4");

-- 我刚刚意识到问题出在我的 mysqli_set_charset 上。那里确实曾经有一个下划线...

拼写为utf8mb4(无下划线)

参见 。 特别是,请阅读答案中的 "Overview of what you should do"。

您不需要更改整个数据库。只为选定的列指定 utf8mb4 就可以了。

您确实需要使用 utf8mb4 进行连接,但您指定了 'UTF-8',这在外界相当于 MySQL 的 utf8mb4。 MySQL 的 utf8utf8mb4 的子集。 (注意:我在使用连字符和下划线时非常精确。)

utf8mb4 对于传输 utf8mb4 和 utf8 子集之间共有的字符来说并不大,也不慢。表情符号是 4 个字节,所以它们比大多数其他字符都大,但你坚持认为它们是 4 个字节;别着急。