刚才,我遇到了一个碰巧以前从未遇到过的问题:
为了在特定列中支持表情符号,我决定将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
的链接,因此,我非常乐意听到一位明智的SO同事对此的想法。 !
在此特定情况下的列:
我的回答包括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
(没有下划线)。
请参阅Trouble with utf8 characters; what I see is not what I stored。
特别是,请阅读答案中的“您应该做什么概述”。
您无需更改整个数据库。只为选定的列指定utf8mb4是可以的。
您确实需要使用utf8mb4
进行连接,但是您指定了'UTF-8'
,这与MySQL的utf8mb4
等效。 MySQL的utf8
是utf8mb4
的子集。 (注意:我在使用连字符和下划线时非常准确。)
对于传输utf8mb4和utf8子集之间共有的字符,utf8mb4既不大,也不慢。表情符号为4个字节,因此它们比大多数其他字符大,但请注意,它们为4个字节;不要流汗。
关于php - 处理混合的utf8和utf8mb4 MYSQLI和PHP,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39934653/