latin1 から UTF8 に変換しようとしている MySQL テーブル列があります。列の値の一部はすでに 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'
更新が選択と異なる理由は何ですか? この問題を回避する方法について何か考えはありますか?