处理混合的 utf8 和 utf8mb4 MYSQLI & PHP
Handling mixed utf8 and utf8mb4 MYSQLI & PHP
刚才,我运行遇到了一个我以前碰巧没有遇到过的问题:
为了在特定列中支持表情符号,我决定将我的 mysqli_set_charset()
设置为 utf8_mb4
以及我的数据库中的一些列编码。
现在,我 运行 遇到 PHP 的问题,实际上没有正确处理来自正常 utf8
编码字段的重音字符。
现在,我一直坚持混合 utf8
和 utf8mb4
结果。由于我的数据处理能力不是很强(曾经使用为我处理所有数据的工作框架),所以我很不熟悉如何最好地解决这个问题。
我考虑过以下方案:
1 ) 将我的整个数据库设置为 utf8mb4
排序规则而不是 utf8
除了少数例外。
2 ) 使用 mysqli_set_charset()
来改变它,并简单地确保获取所述数据的查询是分开的
现在,这些对我来说都不是好主意,但我真的想不出更好的解决方案。
那么剩下的问题是:
- 将我的整个数据库设置为
utf8mb4
而不是 utf8
是否会带来很大的性能变化?我确实意识到 utf8mb4
更大,因此更慢,这就是为什么我首先尝试只在有问题的列上使用它。
- 有没有办法让 PHP 很好地处理
utf8
编码,即使 mysqli_charset
处于打开状态utf8mb4
?
- 你有更好的主意吗?
我在这个问题上真的不知所措,老实说,我猜不出哪个选项是最好的。谷歌搜索它并没有太大帮助,因为它只返回解释它的差异或如何将你的数据库转换为 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 的 utf8
是 utf8mb4
的子集。 (注意:我在使用连字符和下划线时非常精确。)
utf8mb4 对于传输 utf8mb4 和 utf8 子集之间共有的字符来说并不大,也不慢。表情符号是 4 个字节,所以它们比大多数其他字符都大,但你坚持认为它们是 4 个字节;别着急。
刚才,我运行遇到了一个我以前碰巧没有遇到过的问题:
为了在特定列中支持表情符号,我决定将我的 mysqli_set_charset()
设置为 utf8_mb4
以及我的数据库中的一些列编码。
现在,我 运行 遇到 PHP 的问题,实际上没有正确处理来自正常 utf8
编码字段的重音字符。
现在,我一直坚持混合 utf8
和 utf8mb4
结果。由于我的数据处理能力不是很强(曾经使用为我处理所有数据的工作框架),所以我很不熟悉如何最好地解决这个问题。
我考虑过以下方案:
1 ) 将我的整个数据库设置为 utf8mb4
排序规则而不是 utf8
除了少数例外。
2 ) 使用 mysqli_set_charset()
来改变它,并简单地确保获取所述数据的查询是分开的
现在,这些对我来说都不是好主意,但我真的想不出更好的解决方案。
那么剩下的问题是:
- 将我的整个数据库设置为
utf8mb4
而不是utf8
是否会带来很大的性能变化?我确实意识到utf8mb4
更大,因此更慢,这就是为什么我首先尝试只在有问题的列上使用它。 - 有没有办法让 PHP 很好地处理
utf8
编码,即使mysqli_charset
处于打开状态utf8mb4
? - 你有更好的主意吗?
我在这个问题上真的不知所措,老实说,我猜不出哪个选项是最好的。谷歌搜索它并没有太大帮助,因为它只返回解释它的差异或如何将你的数据库转换为 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
(无下划线)
参见
您不需要更改整个数据库。只为选定的列指定 utf8mb4 就可以了。
您确实需要使用 utf8mb4
进行连接,但您指定了 'UTF-8'
,这在外界相当于 MySQL 的 utf8mb4
。 MySQL 的 utf8
是 utf8mb4
的子集。 (注意:我在使用连字符和下划线时非常精确。)
utf8mb4 对于传输 utf8mb4 和 utf8 子集之间共有的字符来说并不大,也不慢。表情符号是 4 个字节,所以它们比大多数其他字符都大,但你坚持认为它们是 4 个字节;别着急。