2017-02-24 25 views
2

私は4つのテーブル(tab1tab2tab3tab4)でMySQLデータベース(myDB;〜2GBのサイズ)を持っています。現在、テーブルに格納されているデータは、文字セットISO-8859-1(つまりLatin-1)を使用して追加されました。MySQLデータベースをLatin-1からUTF-8に移行するにはどうすればよいですか?

私はUTF-8にすべてのテーブルでデータを変換し、テーブル/データベース/列のデフォルトの文字セットとしてUTF-8を使用したいと思います。​​で

は私が興味深いアプローチが見つかりました:私はまだ試していません

mysqldump myDB | sed -i 's/CHARSET=latin1/CHARSET=utf8/g' | iconv -f latin1 -t utf8 | mysql myDB2 

をしますが、注意点がありますか?

MySQLシェルで直接行う方法はありますか?

[EDIT:] SHOW CREATE TABLE messages;

結果ALTER TABLE messages CONVERT TO CHARACTER SET utf8mb4;

CREATE TABLE `messages` (
    `number` int(11) NOT NULL AUTO_INCREMENT, 
    `status` enum('0','1','2') NOT NULL DEFAULT '1', 
    `user` varchar(30) NOT NULL DEFAULT '', 
    `comment` varchar(250) NOT NULL DEFAULT '', 
    `text` mediumtext NOT NULL, 
    `date` int(11) NOT NULL DEFAULT '0', 
    PRIMARY KEY (`number`), 
    KEY `index_user_status_date` (`user`,`status`,`date`) 
) ENGINE=InnoDB AUTO_INCREMENT=3285217 DEFAULT CHARSET=utf8mb4 

答えて

2

を実行した後は、テーブルを変換することが可能です。しかし、あなたもアプリケーションを変換する必要があります。

ALTER TABLE tab1 CONVERT TO utf8mb4; 
etc. 

SHOW CREATE TABLE tab1を確認してください。 CHARACTER SET utf8mb4が表示されます。

注:起こって3つの事があります。

  • は、任意のVARCHARTEXT列のデータのエンコーディングを変換します。
  • このような列についてはCHARACTER SETを変更してください。
  • テーブルのDEFAULT CHARACTER SETを変更します。これは、文字セットを指定せずに新しい列を追加すると有効になります。

アプリケーション...

あなたは、クライアントからのMySQLに接続すると、あなたは、アプリケーション固有の方法で、またはSET NAMESを経由して、クライアントのバイトのエンコーディングを、それを伝える必要があります。これはではなく、は列宣言と同じでなければなりません。必要に応じてINSERTSELECTの間に変換が行われます。

テーブルのコピーをバックアップしてテストすることをお勧めします。

+0

私は 'ALTER TABLE tab1 CONVERT TO CHARACTER SET utf8mb4; 'を実行しました。あなたは、' VARCHARとTEXT列のデータのエンコーディングを変換しますこの段階の間に行われる。これはhttps://dev.mysql.com/doc/refman/5.7/en/alter-table.html#alter-table-character-setで見つけたものです。しかし、実際には**私のテーブルに格納されているデータは変換されていませんでした** - それはまだ 'Latin-1'です - 一部のカラムのデフォルトとデータ型だけが変更されました(' diff dump_before_convert.sql dump_after_cobert.sql'をonダンプ)。 'latin-1'に現在格納されているデータを' utf-8mb4'に変換するにはどうしたらいいですか? –

+0

現在の 'SHOW CREATE TABLE'(少なくともその列について)と' SELECT HEX(col)... 'を表示してください。これらの両方がなければ、実際に何が列にあるのか、それがOKであるかどうかを言うのは難しいです。 –

関連する問題