不知何故,我的数据库表把我所有的表情符号和外国字符都变成了Mojibake。我试图通过使用这个函数来反转它:
UPDATE table SET user_post = convert(cast(convert(user_post using latin1) as binary) using utf8mb4);
看来这在大多数时候都是有效的。但我也注意到,我的大部分数据正在被删除,我的错误如下:
Invalid utf8 character string: 'FC6265'
我不得不恢复我的数据库表,因为这个函数正在清除我的用户帖子的大块,而不仅仅是单个字符。在包含500 k个帖子的表上,这可能会对50 k行产生负面影响。
如果这个函数遇到一个不能正确转换的无效字符,是否有办法防止删除?或者有没有更好的功能将Mojibake转换回合适的字符和表情符号?
更新:
我尝试了一些与这篇文章相关的事情:Trouble with UTF-8 characters; what I see is not what I stored
我发现这些字符似乎是基于HEX
测试的“双重编码”
我尝试使用CONVERT方法在测试产品上运行以下查询:
UPDATE table SET description = IFNULL(CONVERT(CONVERT(CONVERT(description USING latin1) USING binary) USING utf8mb4), description );
但是我得到了一个如下的错误,然后一半的产品描述被删除/截断:
Warning: #1300 Invalid utf8mb4 character string: 'A02047'
在回滚数据库之后,我尝试了ALTER方法(这里描述了:http://mysql.rjweb.org/doc.php/charcoll#fixes_for_various_cases).由于我的专栏已经是utf8 mb 4,我跳到了指南的第3步:
Step 3) ALTER TABLE table MODIFY description LONGTEXT CHARSET latin1;
Step 4) ALTER TABLE table MODIFY description LONGBLOB;
Step 5) ALTER TABLE table MODIFY description LONGTEXT CHARSET utf8mb4;
在步骤3之后,我得到了一堆类似这样的错误(但不是每一行):
Warning: #1366 Incorrect string value: '\xE2\x86\x91\xE2\x86\x91...' for column 'description' at row 34882
Warning: #1366 Incorrect string value: '\xE2\x86\x91\xE2\x86\x93...' for column 'description' at row 45270
...
在步骤5之后,我得到了一堆类似这样的错误,并且描述也被截断,就像CONVERT方法一样:
Warning: #1366 Incorrect string value: '\xA0our m...' for column 'description' at row 20450
Warning: #1366 Incorrect string value: '\xA0</div...' for column 'description' at row 20484
更新#2:
为了清除正在找到的'A0',我使用了以下函数:
UPDATE table SET description = UNHEX(REPLACE(HEX(description), 'A0', ''));
但是我得到了这个错误,然后结果被截断:
Warning: #1366 Incorrect string value: '\xC2 GO F...' for column 'description' at row 1
实际存储在数据库中的确切文本是HTML格式的字符串。我不确定你是否能够看到或复制和粘贴“硬盘空间”后,我在这里发布:
<p><strong><span style="font-size:22px;"><span style="font-family:Arial, Helvetica, sans-serif;">It is covered by the case. GO FIGURE ???</span></span></strong></p>
我相信“硬空格”就在单词“case.”之后,因为当我运行REPLACE查询时,后面的所有内容都会被截断。
更新3
以下是更新前的HEX:3C703E3C7374726F6E673E3C7370616E207374796C653D22666F6E742D73697A653A323270783B223E3C7370616E207374796C653D22666F6E742D66616D696C793A417269616C2C2048656C7665746963612C2073616E732D73657269663B223E4E6F746520746865206C657474657265642065646765206973206E6F742076697369626C652E20497420697320636F76657265642062792074686520636173652EC2A020474F20464947555245203F3F3F3C2F7370616E3E3C2F7370616E3E3C2F7374726F6E673E3C2F703E
更新后的十六进制:3C703E3C7374726F6E673E3C7370616E207374796C653D22666F6E742D73697A653A323270783B223E3C7370616E207374796C653D22666F6E742D66616D696C793A417269616C2C2048656C7665746963612C2073616E732D73657269663B223E497420697320636F76657265642062792074686520636173652E
1条答案
按热度按时间hts6caw31#
你在等
übe
吗?(可能在üben
中?)如果是这样,你有这些编码之一cp 1250,cp 1256,cp 1257,dec 8,latin 1,latin 2,latin 5,latin 7;可能是拉丁语。然而,处理期望看到utf8 mb 4或utf8 mb 3。
你有什么可能是“相反”的Mojibake。
也许这会工作吗?
但我强烈建议首先使用
SELECT
测试它,而不是UPDATE
。参见Trouble with UTF-8 characters; what I see is not what I stored
没有 current UTF-8字符包含十六进制字节
FC
。A0
这可能会删除
A0
垃圾:(But准备好回滚表。)特别是,它可能会弄乱以以下六个字符中的任何一个结尾的行:
*:JZjz
。