web-dev-qa-db-ja.com

My.cnfでMySQLのデフォルトの文字セットをUTF-8に変更しますか?

現在、アプリケーションでは文字セットを UTF-8 に設定するためにPHPで次のコマンドを使用しています。

これは少しオーバーヘッドがあるので、これをMySQLのデフォルト設定として設定します。 /etc/my.cnfまたは他の場所でこれを実行できますか?

SET NAMES 'utf8'
SET CHARACTER SET utf8

/etc/my.cnfでデフォルトの文字セットを探しましたが、文字セットについては何もありません。

この時点で、私はMySQLの文字セットと照合変数をUTF-8に設定するために次のことを行いました。

skip-character-set-client-handshake
character_set_client=utf8
character_set_server=utf8

これは正しい対処方法ですか?

318
Jorre

デフォルトをUTF-8に設定するには、my.cnfに以下を追加します。

[client]
default-character-set=utf8

[mysql]
default-character-set=utf8


[mysqld]
collation-server = utf8_unicode_ci
init-connect='SET NAMES utf8'
character-set-server = utf8

既存のDBの文字セットを変更したい場合は、私に知らせてください...あなたの質問で直接指定されていないので、それがあなたがやりたいのかどうかわかりません。

402
NinjaCat

MySQLの最近のバージョンでは、

default-character-set = utf8

問題を引き起こします。それは私が思うに廃止予定です。

Justin Ball に「 MySQL 5.5.12にアップグレードしてもMySQLが起動しない にある - /、

  1. そのディレクティブを削除してください、そうすればあなたは良いはずです。

  2. それからあなたの設定ファイル(例えば '/etc/my.cnf')はそのようになるはずです:

    [mysqld]
    collation-server = utf8_unicode_ci
    init-connect='SET NAMES utf8'
    character-set-server = utf8
    
  3. MySQLを再起動します。

  4. 念のため、あなたのMySQLはUTF-8であるので、あなたのMySQLプロンプトで以下のクエリを実行してください。

    • 最初のクエリ:

       mysql> show variables like 'char%';
      

      出力は次のようになります。

       +--------------------------+---------------------------------+
       | Variable_name            | Value                           |
       +--------------------------+---------------------------------+
       | character_set_client     | utf8                            |
       | character_set_connection | utf8                            |
       | character_set_database   | utf8                            |
       | character_set_filesystem | binary                          |
       | character_set_results    | utf8                            |
       | character_set_server     | utf8                            |
       | character_set_system     | utf8                            |
       | character_sets_dir       | /usr/local/mysql/share/charsets/|
       +--------------------------+---------------------------------+
      
    • 2番目のクエリ:

       mysql> show variables like 'collation%';
      

      クエリの出力は次のとおりです。

       +----------------------+-----------------+
       | Variable_name        | Value           |
       +----------------------+-----------------+
       | collation_connection | utf8_general_ci |
       | collation_database   | utf8_unicode_ci |
       | collation_server     | utf8_unicode_ci |
       +----------------------+-----------------+
      
244
Mustafah

MySQL 5.5ではmy.cnfを使用しています

[mysqld] 
init_connect='SET collation_connection = utf8_unicode_ci' 
init_connect='SET NAMES utf8' 
character-set-server=utf8 
collation-server=utf8_unicode_ci 
skip-character-set-client-handshake

結果は

mysql> show variables like "%character%";show variables like "%collation%";

+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | utf8                       |
| character_set_connection | utf8                       |
| character_set_database   | utf8                       |
| character_set_filesystem | binary                     |
| character_set_results    | utf8                       |
| character_set_server     | utf8                       |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.00 sec)

+----------------------+-----------------+
| Variable_name        | Value           |
+----------------------+-----------------+
| collation_connection | utf8_unicode_ci |
| collation_database   | utf8_unicode_ci |
| collation_server     | utf8_unicode_ci |
+----------------------+-----------------+
3 rows in set (0.00 sec)
54
tomazzlender

この質問にはすでに多くの答えがありますが、Mathias Bynensは、UTF-8サポートを向上させるには、 'utf8'の代わりに 'utf8mb4'を使用する必要があると述べました( 'utf8'は4バイト文字をサポートしない、フィールドは 挿入時に切り捨てられます )。これは重要な違いだと思います。そのため、デフォルトの文字セットと照合順序の設定方法に関するもう1つの回答があります。あなたがうんちの山を挿入することを可能にするもの(????)。

これはMySQL 5.5.35で動作します。

設定のいくつかはオプションであるかもしれないことに注意してください。私は何も忘れていないという確信が全くないので、この答えをコミュニティウィキにします。

古い設定

mysql> SHOW VARIABLES LIKE 'char%'; SHOW VARIABLES LIKE 'collation%';
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | utf8                       |
| character_set_connection | utf8                       |
| character_set_database   | latin1                     |
| character_set_filesystem | binary                     |
| character_set_results    | utf8                       |
| character_set_server     | latin1                     |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.00 sec)

+----------------------+-------------------+
| Variable_name        | Value             |
+----------------------+-------------------+
| collation_connection | utf8_general_ci   |
| collation_database   | latin1_swedish_ci |
| collation_server     | latin1_swedish_ci |
+----------------------+-------------------+
3 rows in set (0.00 sec)

設定

# ???? ????
# UTF-8 should be used instead of Latin1. Obviously.
# NOTE "utf8" in MySQL is NOT full UTF-8: http://mathiasbynens.be/notes/mysql-utf8mb4

[client]
default-character-set = utf8mb4

[mysqld]
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci

[mysql]
default-character-set = utf8mb4

新しい設定

mysql> SHOW VARIABLES LIKE 'char%'; SHOW VARIABLES LIKE 'collation%';
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | utf8mb4                    |
| character_set_connection | utf8mb4                    |
| character_set_database   | utf8mb4                    |
| character_set_filesystem | binary                     |
| character_set_results    | utf8mb4                    |
| character_set_server     | utf8mb4                    |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.00 sec)

+----------------------+--------------------+
| Variable_name        | Value              |
+----------------------+--------------------+
| collation_connection | utf8mb4_general_ci |
| collation_database   | utf8mb4_unicode_ci |
| collation_server     | utf8mb4_unicode_ci |
+----------------------+--------------------+
3 rows in set (0.00 sec)

character_set_system 常にutf8 です。

これは既存のテーブルには影響しません。デフォルトの設定(新しいテーブルに使用される)にすぎません。次の ALTER code を使用して、既存のテーブルを変換することができます(回避策のダンプなし)。

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

編集する

MySQL 5.0サーバーでは、character_set_client、character_set_connection、character_set_results、collat​​ion_connectionはlatin1のままです。 SET NAMES utf8(utf8mb4はそのバージョンでは利用できません)を発行すると、それらもutf8に設定されます。


警告 :VARCHAR(255)型のインデックス列を持つutf8テーブルがある場合、最大キー長を超えているため(Specified key was too long; max key length is 767 bytes.)、変換できないことがあります。可能であれば、列サイズを255から 191 に減らします(191 * 4 = 764 <767 <192 * 4 = 768のため)。その後、テーブルを変換することができます。

48
basic6

注: my.cnfファイルは/etc/mysql/にあります。

これらの行を追加した後:

[mysqld]
collation-server = utf8_unicode_ci
init-connect='SET NAMES utf8'
character-set-server = utf8
skip-character-set-client-handshake

[client]
default-character-set   = utf8

[mysql]
default-character-set   = utf8

サーバーを再起動することを忘れないでください。

Sudo service mysql restart
26
М.Б.

また、default-character-set = utf8[mysqld]に設定した後、MySQL 5.5.xが Ubuntu 12.04 (Precise Pangolin)で起動しないこともわかりました。

23
amiroff

NijaCatは近かったが、やり過ぎを指定した:

デフォルトをUTF-8に設定するには、my.cnfに以下を追加します。

[client]
default-character-set=utf8

[mysqld]
default-character-set = utf8

次に、確認します。

mysql> show variables like "%character%";show variables like "%collation%";

+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | utf8                       |
| character_set_connection | utf8                       |
| character_set_database   | utf8                       |
| character_set_filesystem | binary                     |
| character_set_results    | utf8                       |
| character_set_server     | utf8                       |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.00 sec)

+----------------------+-----------------+
| Variable_name        | Value           |
+----------------------+-----------------+
| collation_connection | utf8_general_ci |
| collation_database   | utf8_general_ci |
| collation_server     | utf8_general_ci |
+----------------------+-----------------+
3 rows in set (0.00 sec)
23
Derek

Xubuntu 12.04の下で私は単に追加しました

[mysqld]
character_set_server = utf8

/etc/mysql/my.cnfへ

そしてその結果は

mysql> show variables like "%character%";show variables like "%collation%";
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | utf8                       |
| character_set_connection | utf8                       |
| character_set_database   | utf8                       |
| character_set_filesystem | binary                     |
| character_set_results    | utf8                       |
| character_set_server     | utf8                       |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.00 sec)

+----------------------+-----------------+
| Variable_name        | Value           |
+----------------------+-----------------+
| collation_connection | utf8_general_ci |
| collation_database   | utf8_general_ci |
| collation_server     | utf8_general_ci |
+----------------------+-----------------+
3 rows in set (0.00 sec)

また、 http://dev.mysql.com/doc/refman/5.6/en/charset-server.htmlを見てください

9
Falko

ここにリストされているすべての設定は正しいです、しかしここにこれは最も最適で十分な解決策です:

[mysqld]
init_connect='SET collation_connection = utf8_unicode_ci'
character-set-server = utf8
collation-server = utf8_unicode_ci

[client]
default-character-set = utf8

これらを/etc/mysql/my.cnfに追加してください。

パフォーマンスの問題から、 utf8_unicode_ci 照合タイプを選択してください。

年です。結果:

mysql> SHOW VARIABLES LIKE 'character%';
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | utf8                       |
| character_set_connection | utf8                       |
| character_set_database   | utf8                       |
| character_set_filesystem | binary                     |
| character_set_results    | utf8                       |
| character_set_server     | utf8                       |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+

mysql> SHOW VARIABLES LIKE 'collation%';
+----------------------+-----------------+
| Variable_name        | Value           |
+----------------------+-----------------+
| collation_connection | utf8_unicode_ci |
| collation_database   | utf8_unicode_ci |
| collation_server     | utf8_unicode_ci |
+----------------------+-----------------+

そして、これはあなたが 非SUPERユーザー として接続した時です。

例えば、SUPERユーザーとしての接続とSUPER以外のユーザーとしての接続の違い(もちろん utf8_unicode_ci 照合の場合):

_ super _ privを持つユーザー:

mysql> SHOW VARIABLES LIKE 'collation%';
+----------------------+-----------------+
| Variable_name        | Value           |
+----------------------+-----------------+
| collation_connection | utf8_general_ci | <---
| collation_database   | utf8_unicode_ci |
| collation_server     | utf8_unicode_ci |
+----------------------+-----------------+

非SUPER privを持つユーザー:

mysql> SHOW VARIABLES LIKE 'collation%';
+----------------------+-----------------+
| Variable_name        | Value           |
+----------------------+-----------------+
| collation_connection | utf8_unicode_ci |
| collation_database   | utf8_unicode_ci |
| collation_server     | utf8_unicode_ci |
+----------------------+-----------------+

私は 包括的な記事 (rus)を書き、なぜあなたがどちらかのオプションを使うべきかを詳しく説明しました。 文字セット および 照合順序 のすべてのタイプが考慮されます。サーバー用、データベース用、接続用、表用、さらには列用です。

これとこの記事が、はっきりしない瞬間を明確にするのに役立つことを願っています。

9
gahcep

ディレクティブがcharacter-set-system=utf8に変更されました

http://dev.mysql.com/doc/refman/5.6/en/charset-configuration.html

5
Loren

On Fedora 21

$ vi /etc/my.cnf

フォローを追加:

[client]
default-character-set=utf8

[mysql]
default-character-set=utf8

[mysqld]
init_connect='SET collation_connection = utf8_unicode_ci'
init_connect='SET NAMES utf8'
character-set-server=utf8
collation-server=utf8_unicode_ci 
skip-character-set-client-handshake

保存して終了。

最後にservice mysqld restartを使ってサービスmysqldを再起動します。

MySQLのバージョンとLinuxディストリビューションは設定をするときに重要になるかもしれません。

ただし、[mysqld]セクションの下の変更は推奨されています。

私はtomazzlenderの答えについて簡単に説明したいと思います。

[mysqld] 
init_connect='SET collation_connection = utf8_unicode_ci' 
init_connect='SET NAMES utf8' 
character-set-server=utf8 
collation-server=utf8_unicode_ci 
skip-character-set-client-handshake

[mysqld]

これはcollat​​ion_connectionをutf8_unicode_ciに変更します

init_connect='SET collation_connection = utf8_unicode_ci'

SET NAMESを使う:

init_connect='SET NAMES utf8'

SET NAMESは3文字に影響します。

character_set_client
character_set_results
character_set_connection

これはcharacter_set_database & character_set_serverを設定します

character-set-server=utf8

これはcollat​​ion_databaseとcollat​​ion_serverにのみ影響します

collation-server=utf8_unicode_ci

すみません、これが何のためにあるのかよくわかりません。私はそれを使用しません:

skip-character-set-client-handshake
4
Lihang Li

MySQL Workbenchを使用してクライアントの文字セットサポートを確認できない場合は、次の点に注意してください。

重要 MySQL Workbenchによって開かれたすべての接続は、クライアントの文字セットを自動的にutf8に設定します。 SET NAMES ...などを使用してクライアントの文字セットを手動で変更すると、MySQL Workbenchで文字が正しく表示されない場合があります。クライアントの文字セットの詳細については、接続文字セットと照合順序を参照してください。

そのため、MySQL Workbenchの文字セットをmy.cnfの変更で上書きすることはできませんでした。例えば'セット名utf8mb4'

1
paiego

MySQL 5.5、あなたが必要とするのは以下のとおりです。

[mysqld]
character_set_client=utf8
character_set_server=utf8
collation_server=utf8_unicode_ci

collation_serverはオプションです。

mysql> show variables like 'char%';
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | utf8                       |
| character_set_connection | utf8                       |
| character_set_database   | utf8                       |
| character_set_filesystem | binary                     |
| character_set_results    | utf8                       |
| character_set_server     | utf8                       |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.00 sec)
1
Gajus

クライアントの設定に混乱していて、mysqlサービスを再起動した後にconnがリセットされた場合。これらのステップを試してください(これは私にとってはうまくいきました)。

  1. vi /etc/my.cnf
  2. blowと:wq [client] character-sets-dir=/usr/local/mysql/share/mysql/charsetsの内容を追加してください
  3. mysqlを再起動し、mysqlにログインし、データベースを使用し、コマンドstatus;を入力すると、 'client'と 'conn'の文字セットが 'utf8'に設定されます。

詳細については reference を確認してください。

1
John Wen

あなたはそれがそうする方法でそれをすることができます、そしてそれがうまくいかないなら、あなたはmysqlを再起動する必要があります。

0
郭浩伟