我有一个MySQL表列,我正在尝试从latin1转换为UTF8。该列中的某些值已经是UTF8,但它们存储为latin1,这会产生一些看起来很奇怪的文本。切换列非常简单,我所要做的就是:
ALTER TABLE `user_profiles` MODIFY `last_name` varchar(20) CHARACTER SET utf8;
下一步是将任何现在加倍编码的列转换回UTF8。我可以通过运行以下命令获取所有这些列的列表:
SELECT `last_name`, CONVERT(CAST(CONVERT(`last_name` USING latin1) AS BINARY) USING utf8) AS `converted_last_name`
FROM `user_profiles`
WHERE (CONVERT(CAST(CONVERT(`last_name` USING latin1) AS BINARY) USING utf8)) IS NOT NULL
AND CONVERT(CAST(CONVERT(`last_name` USING latin1) AS BINARY) USING utf8) != `last_name`;
这给了我类似的东西:
| last_name | converted_last_name |
| ----------------|----------------------|
| 王维雄 | 王维雄 |
| niño de rivera | niño de rivera |
| Thölix | Thölix |
看起来不错。现在,事情变得奇怪了。如果我运行更新命令:
UPDATE `user_profiles`
SET `last_name` = CONVERT(CAST(CONVERT(`last_name` USING latin1) AS BINARY) USING utf8)
WHERE (CONVERT(CAST(CONVERT(`last_name` USING latin1) AS BINARY) USING utf8)) IS NOT NULL
AND CONVERT(CAST(CONVERT(`last_name` USING latin1) AS BINARY) USING utf8) != `last_name`
我收到1300
这样的错误:
#1300 - Invalid utf8 character string: 'E36F'
知道为什么更新与select不同?关于如何解决这个问题的任何想法?