考慮すべき3つの異なるケースがあります:
値は実際にLatin1を使用してエンコードされています
これは一貫したケースです。宣言された文字セットとコンテンツエンコーディングが一致します。これは私が最初の答えでカバーした唯一のケースでした。
提案したコマンドを使用します:
ALTER TABLE tablename CONVERT TO CHARSET utf8 COLLATE utf8_bin
CONVERT TO CHARACTER SET
に注意してください コマンドはMySQL4.1.2でのみ表示されたため、2005年より前にインストールされたデータベースを使用する場合は、エクスポート/インポートのトリックを使用する必要がありました。これが、インターネット上に非常に多くのレガシースクリプトとドキュメントが古い方法でそれを行っている理由です。
値はすでにutf8を使用してエンコードされています
この場合、mysqlにデータを変換させたくないので、列のメタデータを変更するだけで済みます。
このためには、最初にタイプをBLOBに変更し、次に各列のTEXT utf8に変更して、値の変換が行われないようにする必要があります。
ALTER TABLE t1 CHANGE c1 c1 BLOB;
ALTER TABLE t1 CHANGE c1 c1 TEXT CHARACTER SET utf8
これは推奨される方法であり、Alterに明示的に文書化されています。テーブル構文のドキュメント 。
値は別のエンコーディングで使用されます
一部のLinuxディストリビューションでは、デフォルトのエンコーディングは数年間Latin1でした。この場合、次の2つの手法を組み合わせて使用する必要があります。
- BLOBタイプのトリックを使用して、テーブルのメタデータを修正します
-
CONVERT TO
を使用して値を変換します 。