web-dev-qa-db-ja.com

MySQLデータベースの文字セットと照合順序全体をUTF-8に変換する方法

MySQLデータベース全体の文字セットをUTF-8に、照合順序をUTF-8に変換する方法を教えてください。

412
Dean

ALTER DATABASE および ALTER TABLE コマンドを使用してください。

ALTER DATABASE databasename CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
ALTER TABLE tablename CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

または、まだ4バイトのUTF-8をサポートしていないMySQL 5.5.2以降を使用している場合は、utf8の代わりにutf8mb4を使用します。

ALTER DATABASE databasename CHARACTER SET utf8 COLLATE utf8_unicode_ci;
ALTER TABLE tablename CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci;
641
BalusC
  1. バックアップを取ってください。

  2. その後、データベースにデフォルトの文字セットを設定する必要があります。これは既存のテーブルを変換するのではなく、新しく作成されたテーブルにデフォルトを設定するだけです。

    ALTER DATABASE dbname CHARACTER SET utf8 COLLATE utf8_general_ci;
    
  3. 次に、既存のすべてのテーブルとその列の文字セットを変換する必要があります。これはあなたの現在のデータが実際には現在の文字セットの中にあると仮定しています。カラムがある文字セットに設定されていても、データが別の文字セットに格納されている場合は、 MySQLマニュアル を参照してこれを処理する必要があります。

    ALTER TABLE tbl_name CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;
    
120
newspire

コマンドラインシェル上

あなたがコマンドラインシェルの1人であれば、あなたはこれを非常に速くすることができます。 "dbname"を記入してください:D

DB="dbname"
(
    echo 'ALTER DATABASE `'"$DB"'` CHARACTER SET utf8 COLLATE utf8_general_ci;'
    mysql "$DB" -e "SHOW TABLES" --batch --skip-column-names \
    | xargs -I{} echo 'ALTER TABLE `'{}'` CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;'
) \
| mysql "$DB"

簡単なコピー&ペースト用のワンライナー

DB="dbname"; ( echo 'ALTER DATABASE `'"$DB"'` CHARACTER SET utf8 COLLATE utf8_general_ci;'; mysql "$DB" -e "SHOW TABLES" --batch --skip-column-names | xargs -I{} echo 'ALTER TABLE `'{}'` CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;' ) | mysql "$DB"

SQLを作成して、すべてのテーブルを更新することができます。

SELECT CONCAT("ALTER TABLE ",TABLE_SCHEMA,".",TABLE_NAME," CHARACTER SET utf8 COLLATE utf8_general_ci;   ",
    "ALTER TABLE ",TABLE_SCHEMA,".",TABLE_NAME," CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;  ") 
    AS alter_sql
FROM information_schema.TABLES
WHERE TABLE_SCHEMA = your_database_name;

出力をキャプチャして実行します。

上記のArnold Danielsの答えはもっとエレガントです。

65
sdfor

続行する前に、次のことを確認してください。データベースのフルバックアップを完了しました。

ステップ1:データベースレベルの変更

  • データベースの照合順序と文字セットを識別する

    SELECT DEFAULT_CHARACTER_SET_NAME, DEFAULT_COLLATION_NAME FROM 
    information_schema.SCHEMATA S
    WHERE schema_name = 'your_database_name'
    AND
    (DEFAULT_CHARACTER_SET_NAME != 'utf8'
        OR
     DEFAULT_COLLATION_NAME not like 'utf8%');
    
  • データベースの照合順序を修正する

    ALTER DATABASE databasename CHARACTER SET utf8 COLLATE utf8_unicode_ci;
    

ステップ2:テーブルレベルの変更

  • 誤った文字セットまたは照合順序を持つデータベーステーブルの識別

    SELECT CONCAT(
    'ALTER TABLE ',  table_name, ' CHARACTER SET utf8 COLLATE utf8_general_ci;  ', 
    'ALTER TABLE ',  table_name, ' CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;  ')
    FROM information_schema.TABLES AS T, information_schema.`COLLATION_CHARACTER_SET_APPLICABILITY` AS C
    WHERE C.collation_name = T.table_collation
    AND T.table_schema = 'your_database_name'
    AND
    (C.CHARACTER_SET_NAME != 'utf8'
        OR
     C.COLLATION_NAME not like 'utf8%')
    
  • テーブル列の照合順序と文字セットを調整する

上位SQL出力をキャプチャーして実行します。 (以下のように)

ALTER TABLE rma CHARACTER SET utf8 COLLATE utf8_general_ci;ALTER TABLE rma CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;  
ALTER TABLE rma_history CHARACTER SET utf8 COLLATE utf8_general_ci;ALTER TABLE rma_history CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;  
ALTER TABLE rma_products CHARACTER SET utf8 COLLATE utf8_general_ci;ALTER TABLE rma_products CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;  
ALTER TABLE rma_report_period CHARACTER SET utf8 COLLATE utf8_general_ci;ALTER TABLE rma_report_period CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;  
ALTER TABLE rma_reservation CHARACTER SET utf8 COLLATE utf8_general_ci;ALTER TABLE rma_reservation CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;  
ALTER TABLE rma_supplier_return CHARACTER SET utf8 COLLATE utf8_general_ci;ALTER TABLE rma_supplier_return CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;  
ALTER TABLE rma_supplier_return_history CHARACTER SET utf8 COLLATE utf8_general_ci;ALTER TABLE rma_supplier_return_history CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;  
ALTER TABLE rma_supplier_return_product CHARACTER SET utf8 COLLATE utf8_general_ci;ALTER TABLE rma_supplier_return_product CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci; 

参照してください: https://confluence.atlassian.com/display/CONFKB/How+to+Fix+the+Collat​​ion+and+Character+Set+of+a+MySQL+Database

16
John Yin

HeidiSQL を使用してください。その無料でとても良いdbツール。

ツールメニューから、バルクテーブルエディタに入ります。

完全なデータベースを選択するか、変換するテーブルを選択します。

  • tickデフォルトの照合順序を変更します:utf8mb4_general_ci
  • tick charsetに変換する:utf8

Execute

これは、ほんの数秒で完全なデータベースをラテン語からutf8に変換します。

魅力のように動作します:)

HeidiSQLはデフォルトではutf8として接続するので、特殊文字はすべてテーブルデータの検査時にエンコードされたものではなく、文字(æøå)として表示されます。

ラテン語からutf8に移行するときの真の落とし穴は、pdoがutf8文字セットと確実に接続するようにすることです。そうでなければ、あなたはあなたのウェブページのあちこちにutf8テーブルと疑問符に挿入されたゴミデータを得るでしょう、あなたはテーブルデータがutf8ではないと考えさせます.

7
Tom

@sdforコメントに触発された、これが仕事をするbashスクリプトです。

#!/bin/bash

printf "### Converting MySQL character set ###\n\n"

printf "Enter the encoding you want to set: "
read -r CHARSET

# Get the MySQL username
printf "Enter mysql username: "
read -r USERNAME

# Get the MySQL password
printf "Enter mysql password for user %s:" "$USERNAME"
read -rs PASSWORD

DBLIST=( mydatabase1 mydatabase2 )

printf "\n"


for DB in "${DBLIST[@]}"
do
(
    echo 'ALTER DATABASE `'"$DB"'` CHARACTER SET utf8 COLLATE `'"$CHARSET"'`;'
    mysql "$DB" -u"$USERNAME" -p"$PASSWORD" -e "SHOW TABLES" --batch --skip-column-names \
    | xargs -I{} echo 'ALTER TABLE `'{}'` CONVERT TO CHARACTER SET utf8 COLLATE `'"$CHARSET"'`;'
) \
| mysql "$DB" -u"$USERNAME" -p"$PASSWORD"

echo "$DB database done..."
done

echo "### DONE ###"
exit
5
Camoflame

多数のテーブルがあるデータベースでは、単純なphpスクリプトを使用して、データベースとすべてのテーブルの文字セットを次のように更新できます。

$conn = mysqli_connect($Host, $username, $password, $database);

if ($conn->connect_error) {
  die("Connection failed: " . $conn->connect_error);
}

$alter_database_charset_sql = "ALTER DATABASE ".$database." CHARACTER SET utf8 COLLATE utf8_unicode_ci";
mysqli_query($conn, $alter_database_charset_sql);

$show_tables_result = mysqli_query($conn, "SHOW TABLES");
$tables  = mysqli_fetch_all($show_tables_result);

foreach ($tables as $index => $table) {
  $alter_table_sql = "ALTER TABLE ".$table[0]." CONVERT TO CHARACTER SET utf8  COLLATE utf8_unicode_ci";
  $alter_table_result = mysqli_query($conn, $alter_table_sql);
  echo "<pre>";
  var_dump($alter_table_result);
  echo "</pre>";
}
4
Dan Lucas

データが同じ文字セットではない場合は、 http://dev.mysql.com/doc/refman/5.0/en/charset-conversion.html から抜粋してください。

列に非バイナリデータ型(CHAR、VARCHAR、TEXT)がある場合、その内容は他の文字セットではなく、列文字セットでエンコードする必要があります。コンテンツが別の文字セットでエンコードされている場合は、最初にバイナリデータ型を使用するように列を変換し、次に目的の文字セットを持つ非バイナリ列に変換できます。

これが一例です。

 ALTER TABLE t1 CHANGE c1 c1 BLOB;
 ALTER TABLE t1 CHANGE c1 c1 VARCHAR(100) CHARACTER SET utf8;

正しい照合順序を選択するようにしてください。そうしないと、一意のキー競合が発生する可能性があります。例えば一部の照合では、ÉleanoreとEleanoreは同じと見なされることがあります。

余談:

データベースにUTF-8として格納されているのに、特定の文字が電子メールで「壊れた」という状況がありました。 utf8データを使用してEメールを送信している場合は、EメールをUTF-8で送信するように変換することもできます。

PHPMailerでは、次の行を更新するだけです:public $CharSet = 'utf-8';

4
Frank Forte
mysqldump -uusername -ppassword -c -e --default-character-set=utf8 --single-transaction --skip-set-charset --add-drop-database -B dbname > dump.sql
cp dump.sql dump-fixed.sql
vim dump-fixed.sql


:%s/DEFAULT CHARACTER SET latin1/DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci/
:%s/DEFAULT CHARSET=latin1/DEFAULT CHARSET=utf8/
:wq

mysql -uusername -ppassword < dump-fixed.sql
3
Soumik Guha

最も安全な方法は、まず列をバイナリ型に変更してから、目的の文字セットを使用してその列に変更することです。

次のように、各列型にはそれぞれのバイナリ型があります。

  1. CHAR => BINARY
  2. TEXT => BLOB
  3. TINYTEXT => TINYBLOB
  4. MEDIUMTEXT => MEDIUMBLOB
  5. LONGTEXT => LONGBLOB
  6. VARCHAR => VARBINARY

例えば。:

ALTER TABLE [TABLE_SCHEMA].[TABLE_NAME] MODIFY [COLUMN_NAME] VARBINARY;

ALTER TABLE [TABLE_SCHEMA].[TABLE_NAME] MODIFY [COLUMN_NAME] VARCHAR(140) CHARACTER SET utf8mb4;

私はいくつかのラテン1テーブルを試してみましたが、それはすべての発音区別符号を保持していました。

これを行うすべての列に対してこのクエリを抽出できます。

SELECT
CONCAT('ALTER TABLE ', TABLE_SCHEMA,'.', TABLE_NAME,' MODIFY ', COLUMN_NAME,' VARBINARY;'),
CONCAT('ALTER TABLE ', TABLE_SCHEMA,'.', TABLE_NAME,' MODIFY ', COLUMN_NAME,' ', COLUMN_TYPE,' CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;')
FROM information_schema.columns
WHERE TABLE_SCHEMA IN ('[TABLE_SCHEMA]')
AND COLUMN_TYPE LIKE 'varchar%'
AND (COLLATION_NAME IS NOT NULL AND COLLATION_NAME NOT LIKE 'utf%');

すべての列でこれを実行した後に、すべてのテーブルでそれを実行します。

ALTER TABLE [TABLE_SCHEMA].[TABLE_NAME] CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;

すべてのテーブルに対してこのクエリを生成するには、次のクエリを使用します。

SELECT
CONCAT('ALTER TABLE ', TABLE_SCHEMA, '.', TABLE_NAME, ' CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;')
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_COLLATION NOT LIKE 'utf8%'
and TABLE_SCHEMA in ('[TABLE_SCHEMA]');

そして、すべての列とテーブルを変更したので、データベース上で同じことをします。

ALTER DATABASE [DATA_BASE_NAME] CHARSET = utf8mb4 COLLATE = utf8mb4_general_ci;
2
MalachiteBR
DELIMITER $$  

CREATE PROCEDURE `databasename`.`update_char_set`()  

BEGIN  
 DECLARE done INT DEFAULT 0;  
 DECLARE t_sql VARCHAR(256);  
 DECLARE tableName VARCHAR(128);  
 DECLARE lists CURSOR FOR SELECT table_name FROM `information_schema`.`TABLES` WHERE table_schema = 'databasename';  
 DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = 1;  
 OPEN lists;  
 FETCH lists INTO tableName;  
 REPEAT  
    SET @t_sql = CONCAT('ALTER TABLE ', tableName, ' CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci');  
    PREPARE stmt FROM @t_sql;  
    EXECUTE stmt;  
    DEALLOCATE PREPARE stmt;  
 FETCH lists INTO tableName;  
 UNTIL done END REPEAT;  
 CLOSE lists;  
END$$  

DELIMITER ;  

CALL databasename.update_char_set();
1
剑二十三

テーブルを変換できない場合、またはテーブルが常にutf8以外の文字セットに設定されているのにutf8が必要な場合は、それを消去して最初からやり直して明示的に指定することをお勧めします。

create database database_name character set utf8;
1
user3013048

私にとってうまくいった唯一の解決策: http://docs.moodle.org/23/en/Converting_your_MySQL_database_to_UTF8

テーブルを含むデータベースを変換する

mysqldump -uusername -ppassword -c -e --default-character-set=utf8 --single-transaction --skip-set-charset --add-drop-database -B dbname > dump.sql

cp dump.sql dump-fixed.sql
vim dump-fixed.sql

:%s/DEFAULT CHARACTER SET latin1/DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci/
:%s/DEFAULT CHARSET=latin1/DEFAULT CHARSET=utf8/
:wq

mysql -uusername -ppassword < dump-fixed.sql
0
utapyngo

あなたはそれをより簡単にするDBツールNavicatもできます。

  • シバ.

[データベース]を右クリックし、[DBのプロパティ]を選択し、必要に応じてドロップダウンで変更します。

enter image description here

0
rvsiva17

テーブルtable_nameを変更します。charset = 'utf8';

これは私が私の場合に使用することができた簡単な問い合わせです、あなたはあなたの要件に従ってtable_nameを変更することができます。

0
Aditya Seth

データベース自体の文字セットエンコーディングをUTF-8に変更するには、mysql>プロンプトで次のコマンドを入力します。 DBNAMEをデータベース名に置き換えます。

ALTER DATABASE DBNAME CHARACTER SET utf8 COLLATE utf8_general_ci;
0
Nyein Aung