Php 然后就是“双重编码”。一般来说,阿拉伯语/波斯语/波斯语/波斯语的格式应为Dxyy

Php 然后就是“双重编码”。一般来说,阿拉伯语/波斯语/波斯语/波斯语的格式应为Dxyy,php,mysql,utf-8,Php,Mysql,Utf 8,如果您在与拉丁语连接时阅读拉丁语,您将获得拉丁语†,即拉丁语编码的DA86(拉丁语=DA和=86) ن编码为D986 双重编码 我使用十六进制(col)发送查询,得到了用于ن的C399E280A0和用于چ的C39AE280A0 因此,您有“双重编码”,而不是“Mojibake” C399是Ù的utf8E280A0是utf8表示†。您的字符已两次从latin1更改为utf8。通常情况下,最终结果对外部世界是看不见的,但在表中却是一团糟。这是因为SELECT解码两次。然而,由于您只看到一个解码,所以

如果您在与拉丁语连接时阅读
拉丁语
,您将获得
拉丁语†
,即拉丁语编码的
DA86
拉丁语
=
DA
=
86

ن
编码为
D986

双重编码

我使用十六进制(col)发送查询,得到了用于ن的C399E280A0和用于چ的C39AE280A0

因此,您有“双重编码”,而不是“Mojibake”

C399
Ù的utf8
E280A0
是utf8表示
。您的字符已两次从latin1更改为utf8。通常情况下,最终结果对外部世界是看不见的,但在表中却是一团糟。这是因为
SELECT
解码两次。然而,由于您只看到一个解码,所以事情并没有那么简单

警告:你有一个我没有试验过的情况;我给你的建议可能是错误的

下面是可能发生的事情

  • 客户端的字符编码为utf8(良好)十六进制:
    D986
  • 在插入时,应用程序谎称客户端使用拉丁1编码。(这是旧的默认设置)<代码>D9
转换为
Ù
86
转换为
  • 表中的列声明了字符集utf8(良好)。但是现在
    Ù
    存储为
    C399
    存储为
    E280A0
    ,总共5个字节
  • 当读取连接时,客户端声称utf8(良好),因此这5个字节被转换回
    Ù†
  • 客户尽职地说utf8数据是
    Ù†
  • 注意
    插入
    选择
    之间的不平衡。您为这个
    PHP
    ;PHP是否同时写入和读取数据?书写和阅读的字符集是否有不同的设置

    问题似乎只是在设置写入的字符集。它需要显式为utf8,而不是默认为latin1



    但是数据呢?如果我所说的一切(关于双重编码)都与您拥有的相符,那么
    更新可以修复数据。有关详细信息,请参阅。

    @CharlotteDunois:谢谢您的快速回复,但这不起作用!!它在结果中显示两个字符,即使它们以不同的编码存储,因为这两个字符在指定的排序规则中实际上被认为是等效的。@spencer7593那么如何解决这个问题呢?我想你问的问题是为什么会发生这种情况。行为符合规范要求。这类似于我们在“不区分大小写”排序规则中看到的行为,其中字符“a”和“a”被认为是等效的。我们如何获得不同的行为?我们使用不同的排序规则,即“区分大小写”或“二进制”。类似地,您可以使用不同的排序规则,一个不考虑这两个字符是等价的。“字母以不同的编码存储,我的意思是(α)和(α)”-请详细说明一下。您在哪里以及如何“看到”Ù†和Ú†?表/列的底层存储字符集是什么?@CharlotteDunois:谢谢你的快速回复,但这不起作用!!它在结果中显示两个字符,即使它们以不同的编码存储,因为这两个字符在指定的排序规则中实际上被认为是等效的。@spencer7593那么如何解决这个问题呢?我想你问的问题是为什么会发生这种情况。行为符合规范要求。这类似于我们在“不区分大小写”排序规则中看到的行为,其中字符“a”和“a”被认为是等效的。我们如何获得不同的行为?我们使用不同的排序规则,即“区分大小写”或“二进制”。类似地,您可以使用不同的排序规则,一个不考虑这两个字符是等价的。“字母以不同的编码存储,我的意思是(α)和(α)”-请详细说明一下。您在哪里以及如何“看到”Ù†和Ú†?表/列的底层存储字符集是什么?我测试了utf8\uUnicode\uCI和utf8\uBin。似乎没有人在工作!如果使用
    utf8_-bin
    对带有
    的查询(其中字母='چ'
    )进行查询,则连接排序可能是错误的(
    utf8_-bin
    不了解语言,只了解字节。因此不同的unicode代码点绝对不平等)奇怪的是,utf8_波斯语和utf8_unicode都不把īm(چ)和NūN(ن)视为相等。见和。但可能两者都会将“Ù†”和“Ú†”视为相等,因此他的问题可能是:这里的“真正的”chrset/排序规则是什么。@VolkerK,在这种情况下,我希望错误完全在其他地方,在不了解整个设置的情况下,很难精确指出错误编码的位置(如果它实际上是一个编码错误).我测试了utf8\uUnicode\uCI和utf8\uBin。似乎没有人在工作!如果使用
    utf8_-bin
    对带有
    的查询(其中字母='چ'
    )进行查询,则连接排序可能是错误的(
    utf8_-bin
    不了解语言,只了解字节。因此不同的unicode代码点绝对不平等)奇怪的是,utf8_波斯语和utf8_unicode都不把īm(چ)和NūN(ن)视为相等。见和。但可能两者都会将“Ù†”和“Ú†”视为相等,因此他的问题可能是:这里的“真正的”chrset/排序规则是什么。@VolkerK,在这种情况下,我希望错误完全在其他地方,在不了解整个设置的情况下,很难精确指出错误编码的位置(如果它实际上是一个编码错误).我添加了字符集函数,但那没有用。我想是的
    ⚈  mysqli interface: mysqli_set_charset('utf8') function.
    ⚈  PDO interface: set the charset attribute of the PDO dsn or via SET NAMES utf8.
    
     SELECT col, HEX(col) FROM tbl ...