如何解决错误:#1977 - 无法将“utf8”字符0xD8AD转换为“latin1”

How to resolve ERROR : #1977 - Cannot convert 'utf8' character 0xD8AD to 'latin1'

提问人:Mursaleen Ahmad 提问时间:7/16/2023 更新时间:9/24/2023 访问量:118

问:

我在phpmyadmin中工作,我在名称列中有阿拉伯语值,例如

Ú©Ù“Ø ̈ أرÙ'ÙŠÙ'Ø Ø¹Ù“ÛŒ Ø§Ù”Ø¹Ø²ÛŒØ²Ø ̈وة±ÛŒï

我想将它们转换为适当的形式。

我尝试了这些查询,它转换了表中的大部分记录

ALTER DATABASE alfeker_book CHARACTER SET utf8 COLLATE utf8_unicode_ci;
ALTER TABLE guestbook CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci;
UPDATE guestbook SET name = CONVERT(BINARY CONVERT(name USING latin1) USING utf8mb4);

并且还尝试过

UPDATE guestbook SET name = CONVERT(BINARY CONVERT(name USING binary) USING utf8mb4);

但是很少有人保持不变并给出此错误

#1977 - Cannot convert 'utf8' character 0xD8AD to 'latin1'

我也尝试了这个查询:

SELECT id,name, CONVERT(BINARY CONVERT(name USING latin1) USING utf8mb4) AS converted_name FROM guestbook;

这很好用,可以完美地显示未转换的字符。但是当我使用更新查询时,它不起作用。

mysql utf-8 phpmyadmin sql-update iso-8859-1

评论

1赞 JosefZ 7/16/2023
0xD8AD是(U+D8AD,非私人使用高代理)...

答:

0赞 Rick James 7/16/2023 #1

这就是阿拉伯语文本的 Mojibake 或“双重编码”。

有几种方法可以修复数据。只有一个让它变得更好;其余的则使情况变得更糟。

请阅读 UTF-8 字符的问题;我看到的不是我存储的内容,并按照有关获取数据库中内容的十六进制以及当前模式定义的建议进行操作。同时提供和连接参数。SHOW CREATE TABLESHOW VARIABLES LIKE 'char%';

请在尝试各种 和 之前备份。ALTERsCONVERTs

使用 HEX,我可能会选择适当的转换。

评论

0赞 JosefZ 7/16/2023
'کلب الرقيّة علی العزیزبوری'.encode( 'cp1252').decode('utf-8')返回(以 Python 中的通用可理解性为例)...'کلب الرقيّة علی العزیزبوری'
0赞 Rick James 7/17/2023
我需要你这样做SELECT HEX(columnname) FROM ...