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
是Ù的utf8E280A0
是utf8表示†
。您的字符已两次从latin1更改为utf8。通常情况下,最终结果对外部世界是看不见的,但在表中却是一团糟。这是因为SELECT
解码两次。然而,由于您只看到一个解码,所以事情并没有那么简单
警告:你有一个我没有试验过的情况;我给你的建议可能是错误的
下面是可能发生的事情
- 客户端的字符编码为utf8(良好)十六进制:
D986
李>
- 在插入时,应用程序谎称客户端使用拉丁1编码。(这是旧的默认设置)<代码>D9
转换为Ù
和86
转换为†
李>
Ù
存储为C399
,†
存储为E280A0
,总共5个字节李>
Ù†
李>
Ù†
插入
和选择
之间的不平衡。您为这个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 ...