刚才,我遇到了一个我以前从未遇到的问题:
为了支持特定列中的表情符号,我决定将mysqli_set_charset()
设置为utf8_mb4
,并在我的数据库中编写几列编码。
现在,我遇到了PHP实际上没有正确处理来自普通utf8
编码字段的重音字符的问题。
现在,我坚持使用混合utf8
和utf8mb4
结果。由于我的数据处理不是很强大(习惯于为我处理这一切的工作框架),我对我如何最好地解决这个问题非常不熟悉。
我考虑过以下几个选项:
1)将我的整个数据库设置为utf8mb4
整理而不是utf8
,但有一些例外。
2)使用mysqli_set_charset()
进行更改,并确保获取所述数据的查询是分开的
现在,这些对我来说都不是好主意,但我真的想不出更好的解决方案。
那么还有剩下的问题:
utf8mb4
而不是utf8
会是一个很大的性能变化吗?我确实意识到utf8mb4
更大,因此更慢,这就是为什么我首先尝试仅在有问题的列上使用它。utf8
上有mysqli_charset
,我还有办法让PHP处理好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
上。那里确实曾经是一个下划线...
答案 0 :(得分:1)
拼写为utf8mb4
(无下划线)。
见Trouble with utf8 characters; what I see is not what I stored。 特别是,阅读"概述您应该做什么"在答案中。
您无需更改整个数据库。可以仅为选定的列指定utf8mb4。
您确实需要使用utf8mb4
进行连接,但指定'UTF-8'
,这是外部世界的等同于MySQL的utf8mb4
。 MySQL utf8
是utf8mb4
的子集。 (注意:我正在精确地使用连字符和下划线。)
utf8mb4对于传输utf8mb4和utf8子集之间共同的字符并不大,也不慢。表情符号是4个字节,所以它们比大多数其他字符都要大,但你坚持使用它们是4个字节;不要出汗。