web-dev-qa-db-ja.com

MySQLでUTF-8を適切に処理する方法

昨日聞いた質問 に対する回答の1つは、データベースがUTF-8文字を正しく処理できることを確認する必要があることを示唆しています。 MySQLでこれを行うにはどうすればよいですか?

89
Ben

更新:

短い答え-ほとんど常にutf8mb4文字セットとutf8mb4_unicode_ci照合を使用する必要があります。

データベースを変更するには:

ALTER DATABASE dbname CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

見る:

元の答え:

MySQL 4.1以降には、デフォルトの文字セットUTF-8があります。これはmy.cnfファイルで確認できます。忘れずにbothクライアントとサーバー(default-character-setおよびcharacter-set-serverを設定してください)。

UTF-8に変換する既存のデータがある場合は、データベースをダンプして、UTF-8としてインポートし直してください。

  • データベースにクエリ/挿入する前にSET NAMES utf8を使用します
  • 新しいテーブルを作成するときにDEFAULT CHARSET=utf8を使用します
  • この時点で、MySQLクライアントとサーバーはUTF-8である必要があります(my.cnfを参照)。使用する言語(PHPなど)もUTF-8でなければならないことに注意してください。 PHPの一部のバージョンは、独自のMySQLクライアントライブラリを使用しますが、これはUTF-8に対応していない場合があります。

既存のデータを移行する場合は、最初にバックアップすることを忘れないでください!物事が計画通りに進まない場合、データの奇妙なチョッピングがたくさん起こる可能性があります!

いくつかのリソース:

81
Owen

これを「永久」にするには、my.cnfで:

[client]
default-character-set=utf8
[mysqld]
character-set-server = utf8

確認するには、クライアントに移動していくつかの変数を表示します。

SHOW VARIABLES LIKE 'character_set%';

それらがすべてutf8であることを確認します。ただし、..._filesystembinaryおよび..._dirでなければならず、MySQLインストールのどこかを指します。

38
Javier

MySQL 4.1以降には、utf8を呼び出すデフォルトの文字セットがありますが、実際にはUTF-8のサブセットのみです(3バイト以下の文字のみが許可されます)。

「フル」UTF-8が必要な場合は、utf8mb4を文字セットとして使用します。

30
T.W.R. Cole

短い答え:utf8mb4を4つの場所で使用します:

  • クライアントのバイトは、latin1/cp1251/etcではなく、utf8です。
  • SET NAMES utf8mb4またはMySQLへのクライアントの接続を確立するときに同等のもの
  • CHARACTER SET utf8mb4すべてのテーブル/列-厳密にascii/hex/country_code/Zip_code/etcである列を除く。
  • <meta charset charset=UTF-8>は、HTMLに出力する場合。 (はい、スペルはここで異なります。)

詳細 ;
UTF8ずっと(

上記のリンクは、「すべての懸念に対処するために詳細な正解が必要です」を提供しています。 -このフォーラムにはスペースの制限があります。

編集

CHARACTER SET utf8mb4は、「すべて」の世界の文字を含むことに加えて、COLLATION utf8mb4_unicode_520_ciは、使用するのに最適な「万能」照合であることは間違いありません。 (トルコ語、スペイン語など、これらの言語のニュアンスが必要な人のための照合もあります。)

19
Rick James

文字セットは、データベース(デフォルト)とテーブルのプロパティです。見ることができます(MySQLコマンド):

show create database foo; 
> CREATE DATABASE  `foo`.`foo` /*!40100 DEFAULT CHARACTER SET latin1 */

show create table foo.bar;
> lots of stuff ending with
> ) ENGINE=InnoDB AUTO_INCREMENT=252 DEFAULT CHARSET=latin1

言い換えると;データベースの文字セットを確認したり変更したりするのは非常に簡単です。

ALTER TABLE `foo`.`bar` CHARACTER SET utf8;
4
extraneon

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

ALTER DATABASE DBNAME CHARACTER SET utf8 COLLATE utf8_general_ci;

これはこの質問の複製です MySQLデータベースの文字セットと照合全体をUTF-8に変換する方法?

3
Nyein Aung

Javierのソリューションに従いましたが、my.cnfにいくつかの異なる行を追加しました。

[myslqd]
skip-character-set-client-handshake
collation_server=utf8_unicode_ci
character_set_server=utf8 

私はここでこのアイデアを見つけました: http://dev.mysql.com/doc/refman/5.0/en/charset-server.html ページの下。彼は、skip-character-set-client-handshakeにはある程度の重要性があると述べています。

2
Vlad Balan

database collationUTF-8に設定し、table collationをデータベースのデフォルトに適用します。

0
Gaurav Lad

これらの MySQLとUTF-8のヒント は役に立つかもしれません。残念ながら、それらは完全な解決策ではなく、よくある落とし穴です。

0
Edward Z. Yang