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


12

私は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

回答:


8

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

  • 次のようにデータベースにデータを保存しています 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がファイルをロックする方法のため、MySQLのWindowsバージョンでは動作しません。必要なファイルが呼び出されます。このファイルはdb.opt、のデータベースサブフォルダーにありdatadirます。

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

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

エピローグ

何をするにしても、開発/ステージングサーバーで変更を行って、目的の効果が得られるかどうかを確認してください

更新2012-12-05 11:00 EDT

あなたの質問

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

データの適切な処理を保証するために、あなたはリンゴ同士を持っていることを確認したいかもしれません。データが1つの文字セットとして準備され、データベースと一緒にテーブルにロードされると、別の文字セットがmysqldが取得してDB接続に返送したときに表示されるデータを表示しないようにデータを調整する可能性があります。開発/ステージングサーバーにデータベースをロードして、デフォルトの文字セットを設定してみてください。

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

これは、MySQLバイナリのOSバージョンに依存します。latin1Linuxバージョンではを使用できますが、Windows バージョンでは使用できますutf8


こんにちは、詳細な返信ありがとうございます。実際、私の質問はそれをどのように変更するかということではありません。しかし... 1.本当に変更する必要がありますか?2.一部のデフォルトではutf8を使用し、一部のデフォルトではlatin1を使用する理由
Yoga

1
(最初に感謝します)これは、MySQLバイナリのOSバージョンに依存します。< - I平均、私はデフォルトの間で混合されている理由Ubuntuの、の午前ときlatin1utf8、例えばcharacter_set_connectionUTF8ですがcharacter_set_databaselatin1のである
ヨガ

1
@Rolando [mysqld] character_set_database=utf8 character_set_server=utf8は動作しません。
ホルヘB. 14

ホストOSが馬鹿げた制限付きの文字セットを使用している場合でも、入力を受け入れlatin1て変換する必要がある場合でも、デフォルトでデータベースが任意の文字を表すことができる文字セットにテキストを保存するべきではありませんストレージ用?
アンディ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.