【问题标题】:Handling mixed utf8 and utf8mb4 MYSQLI & PHP处理混合 utf8 和 utf8mb4 MYSQLI & PHP
【发布时间】:2017-02-17 11:32:18
【问题描述】:

刚才,我遇到了一个我偶然没有遇到过的问题:

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

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

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

我考虑过以下选项:

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 上。里面确实有一个下划线...

【问题讨论】:

    标签: php mysql mysqli utf-8 utf8mb4


    【解决方案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 子集之间共有的字符也不会更慢。 Emoji 是 4 个字节,所以它们比大多数其他字符大,但你被困在 4 个字节;不要出汗。

    【讨论】:

    • 我已经阅读了您对另一个问题的回答,我的问题特别与黑色钻石有关。现在,我已经完成了你一开始所说的所有事情。我的元标记、php 标头、几乎我拥有的每个字符集都设置为UTF-8,与此处所写的完全一样。我检索了每个字符串的字符集,并为所有带有特殊字符的字符串返回了UTF-8。 (ASCII 用于非特殊字符串)。我现在唯一能想到的就是我将数据直接从 PHPMyadmin 输入到数据库中(不过,通过查询)。可能是这样吗?我现在很迷茫。
    • Yeeeeeep,最后,感谢您在另一篇文章中的回答,修复了它。很晚才发现在mysqli_set_charset() 上,我必须专门使用utf8utf8mb4,而不是UTF-8。另外,我曾经使用过命名 PHPMyAdmin,这显然很愚蠢。 (我也从那里得到了下划线的拼写!)非常感谢!你应该喝啤酒,我的男人!
    • 感谢您的好评。我花了数年时间将我的建议提炼成那个自我回答的问题。你是说我在那个问答(或这个)中有拼写错误吗?如果是这样,我应该修复它。
    • (我假设你在上次更新中提到的“黑色钻石”上发现了我的建议。)
    • 不,您肯定没有拼写错误。我(起初)并不完全清楚我必须在mysqli_set_charset(); 函数中专门使用utf8utf8mb4。在阅读了您的两个答案后,我第一次尝试使用UTF-8,认为这仍然是PHP的事情。
    猜你喜欢
    • 2016-05-31
    • 1970-01-01
    • 2015-05-05
    • 2012-05-07
    • 2011-04-17
    • 2022-01-23
    • 2019-04-06
    • 2014-01-11
    • 1970-01-01
    相关资源
    最近更新 更多