gpt4 book ai didi

php - 为什么当我调用 Ú† 时,MySQL 查询显示 Ù† 和 Ú† 的结果?

转载 作者:行者123 更新时间:2023-11-30 22:22:44 25 4
gpt4 key购买 nike


我有一个数据库表,其中有一列我对波斯字母进行了分类,以便稍后使用 MySQL WHERE 选择。一切都适用于所有字母,但我在选择在数据库中存储为 (Ù†) 的字母 (?) 和存储为 (Ú†) 的 (?) 时遇到问题。
一开始我认为问题可能出在插入相同的字母上,但是当我检查数据库时,字母以不同的编码存储,我的意思是 (Ù†) 和 (Ú†)。
当我放大这些字母时,U 上的勾号是不同的。当我在网页上回显它们时,这两个字母都正确回显,但是当我选择选择字母 WHERE letter = 'ˆ' 时,它也显示带有 (?) 的字母!!!
所有从数据库插入和读取数据的网页都是UTF-8,数据库排序规则是utf_persian-ci。
我找不到问题出在哪里?任何帮助表示赞赏,

最佳答案

莫吉贝克。 (或不;见下文)可能:

  • 您在客户端中的字节已正确编码为 utf8(良好)。
  • 您连接了 SET NAMES latin1 (或 set_charset('latin1') 或 ...),可能是默认设置。 (应该是 utf8 。)
  • 表格中的列可能是也可能不是CHARACTER SET utf8 ,但应该是这样。

对于 PHP:

⚈  mysqli interface: mysqli_set_charset('utf8') function.
⚈ PDO interface: set the charset attribute of the PDO dsn or via SET NAMES utf8.

COLLATION (例如,utf8_persion_ci)与 Mojibake 相关。它与字符的排序方式有关。

编辑

您说“存储为 (Ù†)”——您怎么知道?大多数查看存储内容的尝试都受到客户端摆弄字节的影响。这是查看其中内容的可靠方法:

 SELECT col, HEX(col) FROM tbl ...

对于 چ , 十六进制应该是 DA86用于正确的 utf8(或 utf8mb4)编码。如果你得到 C39AE280A0 ,那么你就有了“双重编码”。通常,阿拉伯语/波斯语/波斯语的格式应为 Dxyy .

如果您阅读 چ同时连接 latin1 , 你会得到 Ù† ,即 DA86latin1 编码中(Ù = DA = 86)。

ن编码为 D986 .

双重编码

I used hex(col) to send query and got C399E280A0 for ن and C39AE280A0 for چ .

所以,你有“双重编码”,而不是“Mojibake”。

C399 Ù 是 utf8 ; E280A0 是 utf8 .您的字符从 latin1 更改为 utf8 两次。通常最终的结果是外界看不到的,表里却乱七八糟。那是因为 SELECT解码两次。但是,由于您只看到一个解码器,所以事情并没有那么简单。

警告:您遇到的情况我还没有试验过;我给你的建议可能是错误的。

这是可能发生的事情。

  • 客户端将字符编码为 utf8(良好)十六进制:D986 ;
  • 插入时,应用程序谎称客户端具有 latin1 编码。 (这是旧的默认值。); D9转换为 Ù86转换为 ;
  • 表中声明的列CHARACTER SET utf8 (好的)。但是现在 Ù存储为 C399存储为 E280A0 , 总共 5 个字节;
  • 当为客户端读取声明为 utf8(良好)的连接时,因此这 5 个字节被转回为 Ù† ;
  • 客户尽职尽责地说 utf8 数据是 Ù† .

注意 INSERT 之间的不平衡和 SELECT .你标记了这个PHP ; PHP 是否同时写入和读取数据?写入和读取的字符集是否有不同的设置?

问题似乎只出在设置写入字符集上。它需要明确为 utf8,而不是默认为 latin1。

但是数据呢?如果我所说的一切(关于双编码)与你所拥有的相匹配,那么一个 UPDATE可以修复数据。参见 my blog了解详情。

关于php - 为什么当我调用 Ú† 时,MySQL 查询显示 Ù† 和 Ú† 的结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36239131/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com