web-dev-qa-db-ja.com

MySQLテーブルをUTF-8に変更するにはどうすればよいですか?

テーブルとデータベースの言語には多くの設定があることを知っています。

すでにデータベースを作成しています。私がそれを作成したとき、それはデフォルト/ラテンでした。私はすべてを変更したいと思います-つまり、テーブルとデータベースの両方をUTF-8に変更します。

どうやってやるの?ありがとう。

26
TIMEX
ALTER TABLE tbl_name CONVERT TO CHARACTER SET utf8;
52
Developer-Sid

alterコマンドを使用して文字セットを変更する を見てください。

別の便利なリンク: http://dev.mysql.com/doc/refman/5.0/en/charset-table.html

一般的な形式は

ALTER DATABASE db_name
    [[DEFAULT] CHARACTER SET charset_name]
    [[DEFAULT] COLLATE collation_name]

テーブルの特定の列

ALTER TABLE column COLLATE utf8_general_ci

5
aioobe

aioobeの答えは、データベース、テーブル、または列の文字セットを変更する方法を示しています。あなたはそれを覚えておくべきです

  • テーブルの文字セットの設定は、そのテーブルの新しい列のデフォルトの文字セットを指定するだけです。既存の列の文字セットは変更されません。これらの列を個別に実行する必要があります。ORテーブル内のすべての文字列タイプの列を同じ文字セットに変更する場合は、次のコマンドを使用できます: "alter table ...文字セットに変換 "( http://dev.mysql.com/doc/refman/5.1/en/alter-table.html

  • 列に誤ってエンコードされて格納されたデータがすでにある場合、「alter table ... modify」を使用して列を変更しても問題は完全には解決しません。たとえば、Latin1列にUTF-8データを格納していて、文字セットを直接Latin1からUTF-8に変更した場合でも、後で誤ってエンコードされます。これは、バイナリを介してLatin-1からUTF-8に変換することで回避できます。

4
Philip Eve

1)データベースのデフォルトの文字セットと照合:

SELECT @@character_set_database, @@collation_database;

変更後:ALTER DATABASE CHARACTER SET utf8 COLLATE utf8_general_ci;

2)テーブルのデフォルトの文字セットと照合順序:

SELECT T.table_name, CCSA.character_set_name 
FROM information_schema.TABLES T, information_schema.COLLATION_CHARACTER_SET_APPLICABILITY CCSA 
WHERE CCSA.collation_name = T.table_collation AND T.table_schema = "YOUR_DB";`

変更後:ALTER TABLE [table_name] CHARACTER SET utf8 COLLATE utf8_general_ci

3)列の文字セットと照合順序:

SELECT c.TABLE_NAME, c.COLUMN_NAME, c.CHARACTER_SET_NAME, c.COLLATION_NAME 
FROM information_schema.COLUMNS c
WHERE c.table_schema = "YOUR_DB";`

変更後:ALTER TABLE [table_name] CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci

3番目の方法では、データ変換の外部キーチェックを無効にする必要があります。これをすべてまとめると:

DELIMITER //
CREATE PROCEDURE migrate_charset_to_utf8()
  BEGIN
    DECLARE done TINYINT DEFAULT 0;
    DECLARE curr_table VARCHAR(64);

    DECLARE table_cursor CURSOR FOR
    SELECT T.table_name
      FROM information_schema.TABLES T
      WHERE T.TABLE_TYPE = 'BASE TABLE' AND
        T.TABLE_SCHEMA = 'YOUR_DB';
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;

    OPEN table_cursor;

    table_loop: LOOP
      FETCH table_cursor INTO curr_table;
      IF done THEN
        LEAVE table_loop;
      END IF;

      # Convert table data(columns) charset
      SET @sql_str1 = CONCAT("ALTER TABLE ", curr_table, " CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci");
      PREPARE stmt1 FROM @sql_str1;
      EXECUTE stmt1;
      DEALLOCATE PREPARE stmt1;

      # Set table's default charset e.g for new columns added
      SET @sql_str2 = CONCAT("ALTER TABLE ", curr_table, " CHARACTER SET utf8 COLLATE utf8_general_ci");
      PREPARE stmt2 FROM @sql_str2;
      EXECUTE stmt2;
      DEALLOCATE PREPARE stmt2;

    END LOOP table_loop;

    CLOSE table_cursor;
  END//

DELIMITER ;


SET @@FOREIGN_KEY_CHECKS = 0;
CALL migrate_charset_to_utf8();
SET @@FOREIGN_KEY_CHECKS = 1;

ALTER DATABASE CHARACTER SET utf8 COLLATE utf8_general_ci;

編集:代わりに見てください ここ

1
Roly