处理混合的utf8和utf8mb4 MYSQLI& PHP

时间:2016-10-08 16:23:38

标签: php mysql mysqli utf-8 utf8mb4

刚才,我遇到了一个我以前从未遇到的问题:

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

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

现在,我坚持使用混合utf8utf8mb4结果。由于我的数据处理不是很强大(习惯于为我处理这一切的工作框架),我对我如何最好地解决这个问题非常不熟悉。

我考虑过以下几个选项:

1)将我的整个数据库设置为utf8mb4整理而不是utf8,但有一些例外。

2)使用mysqli_set_charset()进行更改,并确保获取所述数据的查询是分开的

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

那么还有剩下的问题:

  • 将我的整个数据库设置为utf8mb4而不是utf8会是一个很大的性能变化吗?我确实意识到utf8mb4更大,因此更慢,这就是为什么我首先尝试仅在有问题的列上使用它。
  • 即使utf8上有mysqli_charset,我还有办法让PHP处理好utf8mb4编码吗?
  • 你有更好的主意吗?

我真的在这个问题上失败了,老实说我猜不出哪个选项最好。谷歌搜索它没有多大帮助,因为它只返回链接解释它的差异或如何将您的数据库转换为utf8mb4,所以我非常希望听到这个明智之一的想法所以同事们!

此特定情况下的列:

enter image description here

我的回复包括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上。那里确实曾经是一个下划线...

1 个答案:

答案 0 :(得分:1)

拼写为utf8mb4(无下划线)。

Trouble with utf8 characters; what I see is not what I stored。 特别是,阅读"概述您应该做什么"在答案中。

您无需更改整个数据库。可以仅为选定的列指定utf8mb4。

您确实需要使用utf8mb4进行连接,但指定'UTF-8',这是外部世界的等同于MySQL的utf8mb4。 MySQL utf8utf8mb4的子集。 (注意:我正在精确地使用连字符和下划线。)

utf8mb4对于传输utf8mb4和utf8子集之间共同的字符并不大,也不慢。表情符号是4个字节,所以它们比大多数其他字符都要大,但你坚持使用它们是4个字节;不要出汗。