5

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'

更新が選択と異なる理由は何ですか? この問題を回避する方法について何か考えはありますか?

4

0 に答える 0