5

我有一个 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'

知道为什么更新与选择不同吗?关于如何解决这个问题的任何想法?

4

0 回答 0