2013-08-26 4 views
16

私は無知開発中に私のデータベースでvarchar型の列のすべてのデフォルトlatin1_swedish_ci文字エンコーディングを使用し、私はこれは私が持ってきた文字エンコーディングの問題の根本であると判断しました。それに加えて、最近ほとんどの人がutf8_unicode_ciを使うことを推奨しているようです。latin1_swedish_ciからutf8_unicode_ciへのすべての行の照合順序を変更するにはどうすればよいですか?

データベースのすべての行の文字エンコーディングをlatin1_swedish_ciからutf8_unicode_ciに変換したいのですが、私が行う方法を知っている唯一の方法は、phpMyAdminで行単位で変更することです。これは本当に時間がかかる。

すべてのvarchar/text行の照合をlatin1_swedish_ciからutf8_unicode_ciに変更するクエリなど、より高速な方法はありますか?

答えて

35

列が、その後設定されたデフォルトのテーブルの文字を使用している場合は、変換するテーブルごとに1つのクエリです:

ALTER TABLE t CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci; 

ことを行うための方法はありません私の知る限り、文字セットは、各列に個別に設定されている場合データベース内のすべてのテーブルのすべての列に直接MySqlで書かれていますが、あなたが選んだ言語で小さなプログラムを書くことができます。それは適切なキャラクタセットと照合順序を変更する場でALTER TABLEクエリを合成し、実行するために些細だ各結果行に対して

SELECT * FROM `INFORMATION_SCHEMA.COLUMNS` 
WHERE TABLE_SCHEMA = 'dbname' AND CHARACTER_SET_NAME = 'latin1' 

あなたのプログラムがINFORMATION_SCHEMA.COLUMNS表を照会し、CHARACTER_SET_NAME列になります。

ALTER TABLE t MODIFY col TEXT CHARACTER SET utf8 COLLATE utf8_unicode_ci; 
上記クエリ tにおいて

colTEXTTABLE_NAMEの値となり、012 INFORMATION_SCHEMA.COLUMNS結果セットのおよびDATA_TYPEの列。

+0

ありがとうございました!それは素晴らしい仕事と私に巨大な時間を節約! – Nate

+0

良い答え。 utf8_unicode_ci'がより正確である 'として私の知る限りでは、' utf8_unicode_ci'は、代わりにutf8_general_ci' 'を使用する必要があります。したがって、 'utf8_unicode_ci'の使用を推奨するべきです。 http://stackoverflow.com/questions/766809/whats-the-difference-between-utf8-general-ci-and-utf8-unicode-ci –

+0

@Sudarshan_SMD私が代わりにユニコードの一般的な使用、なぜあなたは、必ず右ではありません、特にその質問が将軍に言われていると考えると、今は長すぎる。それをキャッチするためにありがとう! – Jon

9

あなたが実際に手順を使用して、MySQLの内部でこれを行うことができます。 https://stackoverflow.com/a/12718767/1612273に基づいて

。それは現在のデータベースを使用するので、あなたが正しいデータベースでそれをやっていることを確認してください!

delimiter // 

DROP PROCEDURE IF EXISTS convert_database_to_utf8 // 

CREATE PROCEDURE convert_database_to_utf8() 
BEGIN 
    DECLARE table_name VARCHAR(255); 
    DECLARE done INT DEFAULT FALSE; 

    DECLARE cur CURSOR FOR 
     SELECT t.table_name FROM information_schema.tables t WHERE t.table_schema = DATABASE() AND t.table_type='BASE TABLE'; 
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE; 

    OPEN cur; 
     tables_loop: LOOP 
      FETCH cur INTO table_name; 

      IF done THEN 
       LEAVE tables_loop; 
      END IF; 

      SET @sql = CONCAT("ALTER TABLE ", table_name, " CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci"); 
      PREPARE stmt FROM @sql; 
      EXECUTE stmt; 
      DROP PREPARE stmt; 
     END LOOP; 
    CLOSE cur; 
END // 

delimiter ; 
call convert_database_to_utf8(); 
関連する問題