web-dev-qa-db-ja.com

デフォルトのcharacter_set_serverがlatin1であるのはなぜですか?

MySQL 5.5を使用していて、文字セットに関する変数を表示すると、

+--------------------------+----------------------------+
| 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/ |
+--------------------------+----------------------------+

character_set_databasecharacter_set_serverutf8に変更する必要がありますか?

12
Yoga

それについて考えてください:

  • latin1としてデータベースにデータを保存しています
  • あなたはデータがmysqldによってlatin1として内部的に処理されている

OSまたは接続からのデータがutf8の場合、mysqldはどのように処理しますか?

最良のものを推測または期待するのではなく、着信文字セットの動作を変更できます。 information_schemamysqlを除いて、すべてのデータベースを取得して、デフォルトの文字セットをutf8に設定します。

ALTER DATABASE dbname CHARACTER SET utf8;

それに対応する特定の照合がある場合は、次のようにします。

ALTER DATABASE dbname COLLATE 'utf8_general_ci';

選択する照合は次のとおりです。

mysql> select * from information_schema.collations where CHARACTER_SET_NAME = 'utf8';
+--------------------+--------------------+-----+------------+-------------+---------+
| COLLATION_NAME     | CHARACTER_SET_NAME | ID  | IS_DEFAULT | IS_COMPILED | SORTLEN |
+--------------------+--------------------+-----+------------+-------------+---------+
| utf8_general_ci    | utf8               |  33 | Yes        | Yes         |       1 |
| utf8_bin           | utf8               |  83 |            | Yes         |       1 |
| utf8_unicode_ci    | utf8               | 192 |            | Yes         |       8 |
| utf8_icelandic_ci  | utf8               | 193 |            | Yes         |       8 |
| utf8_latvian_ci    | utf8               | 194 |            | Yes         |       8 |
| utf8_romanian_ci   | utf8               | 195 |            | Yes         |       8 |
| utf8_slovenian_ci  | utf8               | 196 |            | Yes         |       8 |
| utf8_polish_ci     | utf8               | 197 |            | Yes         |       8 |
| utf8_estonian_ci   | utf8               | 198 |            | Yes         |       8 |
| utf8_spanish_ci    | utf8               | 199 |            | Yes         |       8 |
| utf8_swedish_ci    | utf8               | 200 |            | Yes         |       8 |
| utf8_turkish_ci    | utf8               | 201 |            | Yes         |       8 |
| utf8_czech_ci      | utf8               | 202 |            | Yes         |       8 |
| utf8_danish_ci     | utf8               | 203 |            | Yes         |       8 |
| utf8_lithuanian_ci | utf8               | 204 |            | Yes         |       8 |
| utf8_slovak_ci     | utf8               | 205 |            | Yes         |       8 |
| utf8_spanish2_ci   | utf8               | 206 |            | Yes         |       8 |
| utf8_roman_ci      | utf8               | 207 |            | Yes         |       8 |
| utf8_persian_ci    | utf8               | 208 |            | Yes         |       8 |
| utf8_esperanto_ci  | utf8               | 209 |            | Yes         |       8 |
| utf8_hungarian_ci  | utf8               | 210 |            | Yes         |       8 |
| utf8_sinhala_ci    | utf8               | 211 |            | Yes         |       8 |
+--------------------+--------------------+-----+------------+-------------+---------+
22 rows in set (0.03 sec)

あなたも走ることができます

mysql> show collation where charset='utf8';
+--------------------+---------+-----+---------+----------+---------+
| Collation          | Charset | Id  | Default | Compiled | Sortlen |
+--------------------+---------+-----+---------+----------+---------+
| utf8_general_ci    | utf8    |  33 | Yes     | Yes      |       1 |
| utf8_bin           | utf8    |  83 |         | Yes      |       1 |
| utf8_unicode_ci    | utf8    | 192 |         | Yes      |       8 |
| utf8_icelandic_ci  | utf8    | 193 |         | Yes      |       8 |
| utf8_latvian_ci    | utf8    | 194 |         | Yes      |       8 |
| utf8_romanian_ci   | utf8    | 195 |         | Yes      |       8 |
| utf8_slovenian_ci  | utf8    | 196 |         | Yes      |       8 |
| utf8_polish_ci     | utf8    | 197 |         | Yes      |       8 |
| utf8_estonian_ci   | utf8    | 198 |         | Yes      |       8 |
| utf8_spanish_ci    | utf8    | 199 |         | Yes      |       8 |
| utf8_swedish_ci    | utf8    | 200 |         | Yes      |       8 |
| utf8_turkish_ci    | utf8    | 201 |         | Yes      |       8 |
| utf8_czech_ci      | utf8    | 202 |         | Yes      |       8 |
| utf8_danish_ci     | utf8    | 203 |         | Yes      |       8 |
| utf8_lithuanian_ci | utf8    | 204 |         | Yes      |       8 |
| utf8_slovak_ci     | utf8    | 205 |         | Yes      |       8 |
| utf8_spanish2_ci   | utf8    | 206 |         | Yes      |       8 |
| utf8_roman_ci      | utf8    | 207 |         | Yes      |       8 |
| utf8_persian_ci    | utf8    | 208 |         | Yes      |       8 |
| utf8_esperanto_ci  | utf8    | 209 |         | Yes      |       8 |
| utf8_hungarian_ci  | utf8    | 210 |         | Yes      |       8 |
| utf8_sinhala_ci    | utf8    | 211 |         | Yes      |       8 |
+--------------------+---------+-----+---------+----------+---------+
22 rows in set (0.00 sec)

mysql>

データベースの個々の文字セットを表示するには、次を実行します。

mysql> show create database sample;
+----------+-------------------------------------------------------------------+
| Database | Create Database                                                   |
+----------+-------------------------------------------------------------------+
| sample   | CREATE DATABASE `sample` /*!40100 DEFAULT CHARACTER SET latin1 */ |
+----------+-------------------------------------------------------------------+
1 row in set (0.00 sec)

mysql>

設定に関しては、これを試すことができます:

my.cnfに行を追加します

[mysqld]
character_set_database=utf8
character_set_server=utf8

その後、mysqlを再起動します

2011年8月1日にこれについて話し合った: テーブル内の文字セットエンコーディング

CAVEAT(WindowsのMySQL DBサーバーの場合)

これらのコマンド

ALTER DATABASE dbname CHARACTER SET utf8;
ALTER DATABASE dbname COLLATE 'utf8_general_ci';

windowsがファイルをロックする方法のため、WindowsバージョンのMySQLでは機能しません。必要なファイルはdb.optで、datadirのデータベースサブフォルダーにあります。

次のことを行う必要がある場合があります。

  • mysqldumpそのデータベース(データベース作成情報ではなく、テーブル作成とINSERTのみ)
  • そのデータベースを削除する
  • 特定の文字セットと照合順序でデータベースを作成する
  • それにダンプをリロードします

エピローグ

何をするにせよ、Dev/Staging Serverに変更を加えて、望ましい効果が得られるかどうかを確認してください

UPDATE 2012-12-05 11:00 EDT

あなたの質問

本当に変更する必要がありますか?

データの適切な処理を保証するために、リンゴ同士を確実に持ちたいと思うかもしれません。データを1つの文字セットとして準備し、データベースと一緒にテーブルにロードすると、別の文字セットを参照しているかのようにデータが調整される可能性があります。 Dev/Staging Serverにデータベースをロードして、デフォルトの文字セットを設定してみてください。

一部のデフォルトでutf8が使用されているのに、一部のデフォルトではlatin1が使用されているのはなぜですか?

これは、MySQLバイナリのOSバージョンに依存します。 Windowsバージョンではlatin1が使用され、Linuxバージョンではutf8が使用される場合があります。

8
RolandoMySQLDBA