MySQLの文字セット設定を5分で理解しましょう

MySQLの文字セット設定を5分で理解しましょう

1. コンテンツの概要

MySQL を使用する場合、文字セットと文字シーケンスの概念、およびさまざまな設定がデータの保存と比較に与える影響を理解することが非常に重要です。多くの学生が日常業務で遭遇する「文字化け」の問題は、文字セットと文字シーケンスの理解不足や設定の誤りによって発生する可能性が最も高いです。

この記事では、基本的な内容から複雑な内容まで、以下の内容を紹介します。

  1. 文字セットと文字シーケンス間の基本的な概念と接続
  2. MySQLでサポートされている文字セットと文字順序の設定、および各設定レベルの関係
  3. サーバー、データベース、テーブル、列レベルの文字セットと文字シーケンスを表示および設定します。
  4. 文字セットと文字シーケンスはいつ設定すればよいですか?

2. 文字セットと文字順序の概念と関係

データを保存するときに、MySQL はさまざまな文字セットをサポートします。データを比較する場合、異なる文字順序のサポートが提供されます。

MySQL は、サーバー レベル、データベース レベル、テーブル レベル、列レベルなど、さまざまなレベルで設定を提供し、非常に正確な設定を行うことができます。

文字セットと文字シーケンスとは何ですか?簡単に言えば:

  1. 文字セット: 文字と文​​字エンコーディングを定義します。
  2. 照合: 文字の比較規則を定義します。

例えば:

文字は A、B、a、b の 4 つです。これらの 4 つの文字のコードは、それぞれ A = 0、B = 1、a = 2、b = 3 です。ここでの文字 + エンコーディングが文字セットを構成します。

2 つの文字のサイズを比較したい場合はどうすればよいでしょうか?たとえば、A と B、または a と b を比較する場合、最も直感的な方法は、エンコードを使用することです。たとえば、0 < 1 なので、A < B となります。

さらに、A と a については、エンコードが異なりますが、大文字と小文字は等しい、つまり A == a であると考えられます。

上記では 2 つの比較規則が定義されており、これらの比較規則のセットが照合です。

  1. 大文字と小文字の両方の場合、エンコード サイズが比較されます。
  2. 2 つの文字が同じ大文字/小文字の場合、それらは等しくなります。

3. MySQL でサポートされている文字セットと文字シーケンス

MySQL は複数の文字セットと文字シーケンスをサポートしています。

  1. 文字セットは、少なくとも 1 つの文字シーケンス (通常は 1 対多) に対応します。
  2. 2 つの異なる文字セットに同じ文字シーケンスを指定することはできません。
  3. 各文字セットにはデフォルトの文字順序があります。

上記はかなり抽象的です。何が起こっているかを理解するために、次のいくつかのセクションを見てみましょう。

1. サポートされている文字セットを表示する

MYSQL でサポートされている文字セットは、次の方法で確認できます。

方法1:

mysql> 文字セットを表示します。
+----------+-----------------------------+----------------------+--------+
| 文字セット | 説明 | デフォルトの照合順序 | Maxlen |
+----------+-----------------------------+----------------------+--------+
| big5 | Big5 繁体字中国語 | big5_chinese_ci | 2 |
| dec8 | DEC 西ヨーロッパ | dec8_swedish_ci | 1 |
...省略

方法2:

mysql> information_schema を使用します。
mysql> CHARACTER_SETS から * を選択します。
+--------------------+----------------------+----------------------------+--------+
| CHARACTER_SET_NAME | DEFAULT_COLLATE_NAME | 説明 | MAXLEN |
+--------------------+----------------------+----------------------------+--------+
| big5 | big5_chinese_ci | Big5 繁体字中国語 | 2 |
| dec8 | dec8_swedish_ci | DEC 西ヨーロッパ語 | 1 |
...省略

SHOW CHARACTER SET を使用して表示するときには、WHERE または LIKE 制限を追加することもできます。

例 1: WHERE 条件の使用。

mysql> SHOW CHARACTER SET WHERE Charset="utf8";
+---------+---------------+-------------------+--------+
| 文字セット | 説明 | デフォルトの照合順序 | Maxlen |
+---------+---------------+-------------------+--------+
| utf8 | UTF-8 ユニコード | utf8_general_ci | 3 |
+---------+---------------+-------------------+--------+
セット内の 1 行 (0.00 秒)

例 2: LIKE 条件を使用します。

mysql> SHOW CHARACTER SET LIKE "utf8%";
+---------+---------------+---------------------+--------+
| 文字セット | 説明 | デフォルトの照合順序 | Maxlen |
+---------+---------------+---------------------+--------+
| utf8 | UTF-8 ユニコード | utf8_general_ci | 3 |
| utf8mb4 | UTF-8 ユニコード | utf8mb4_general_ci | 4 |
+---------+---------------+---------------------+--------+
セット内の 2 行 (0.00 秒)

2. サポートされている文字シーケンスを表示する

同様に、MYSQL でサポートされている文字シーケンスを次の方法で表示できます。

方法 1: SHOW COLLATION を通じて表示します。

ご覧のとおり、utf8 文字セットには 10 を超える文字シーケンスがあります。 Default の値が Yes であるかどうかを確認して、デフォルトの文字シーケンスが使用されているかどうかを確認します。

mysql> SHOW COLLATION WHERE Charset = 'utf8';
+--------------------------+---------+-----+----------+----------+----------+
| 照合 | 文字セット | ID | デフォルト | コンパイル済み | ソート長 |
+--------------------------+---------+-----+----------+----------+----------+
| utf8_general_ci | utf8 | 33 | はい | はい | 1 |
| utf8_bin | utf8 | 83 | | はい | 1 |
...わずかに

方法 2: information_schema.COLLATIONS をクエリします。

mysql> information_schema を使用します。
mysql> SELECT * FROM COLLATIONS WHERE CHARACTER_SET_NAME="utf8";
+--------------------------+--------------------+-----+-------------+-----------+----------+
| COLLATION_NAME | CHARACTER_SET_NAME | ID | IS_DEFAULT | IS_COMPILED | SORTLEN |
+--------------------------+--------------------+-----+-------------+-----------+----------+
| utf8_general_ci | utf8 | 33 | はい | はい | 1 |
| utf8_bin | utf8 | 83 | | はい | 1 |
| utf8_unicode_ci | utf8 | 192 | | はい | 8 |

3. 文字列の命名規則

文字シーケンスは、以下に示すように、対応する文字セットをプレフィックスとして付けて名前が付けられます。たとえば、文字シーケンス utf8_general_ci は、文字セット utf8 の文字シーケンスであることを示します。

詳しいルールについては、公式ドキュメントを参照してください。

MariaDB [information_schema]> SELECT CHARACTER_SET_NAME, COLLATION_NAME FROM COLLATIONS WHERE CHARACTER_SET_NAME="utf8" limit 2; 
+--------------------+-----------------+
| 文字セット名 | 照合名 |
+--------------------+-----------------+
| utf8 | utf8_general_ci |
| utf8 | utf8_bin |
+--------------------+-----------------+
セット内の 2 行 (0.00 秒)

4. サーバー文字セットと文字シーケンス

目的: データベースを作成し、文字セットまたは文字順序を指定しない場合は、サーバーの文字セットとサーバーの文字順序がデータベースのデフォルトの文字セットとソート規則として使用されます。

指定方法: MySQL サービスを起動するときに、コマンドライン パラメータを使用して指定できます。設定ファイル内の変数を使用して指定することもできます。

サーバーのデフォルトの文字セットと文字順序: MySQL のコンパイル時にコンパイル パラメータを通じて指定されます。

character_set_server と collat​​ion_server は、それぞれサーバー文字セットとサーバー文字シーケンスに対応します。

1. サーバーの文字セットと文字シーケンスを確認する

これらはそれぞれ、character_set_server および collat​​ion_server システム変数に対応します。

mysql> "character_set_server"のような変数を表示します。
mysql> "collat​​ion_server"のような変数を表示します。

2. サービスを開始するときに指定する

MySQL サービスを起動するときに、サーバーの文字セットと文字シーケンスを指定できます。指定しない場合、デフォルトの文字順序はlatin1、latin1_swedish_ciです。

mysqld --character-set-server=latin1 \
 --collat​​ion-server=latin1_swedish_ci

サーバーの文字セットを別途指定します。この場合、サーバーの文字シーケンスは latin1 のデフォルトの文字シーケンスである latin1_swedish_ci です。

mysqld --character-set-server=latin1

3. 設定ファイルの仕様

コマンドラインパラメータで指定するだけでなく、次に示すように構成ファイルで指定することもできます。

 [クライアント]
デフォルトの文字セット=utf8
[mysql]
デフォルトの文字セット=utf8
[mysqld]
照合サーバー = utf8_unicode_ci
init-connect='名前をutf8に設定'
文字セットサーバー = utf8

4. ランタイムの変更

例: 実行時の変更(再起動後は無効になります。再起動後も変更しない場合は、設定ファイルに書き込む必要があります)

mysql> SET character_set_server = utf8;

5. コンパイル時にデフォルトの文字セットと文字シーケンスを指定する

character_set_server と collat​​ion_server のデフォルト値は、MySQL をコンパイルするときにコンパイル オプションを通じて指定できます。

cmake . -DDEFAULT_CHARSET=latin1 \
  -DDEFAULT_COLLATION=ラテン語1_ドイツ語1_ci

5. データベースの文字セットと文字シーケンス

目的: データベース レベルで文字セットと文字シーケンスを指定します。同じ MySQL サービス下のデータベースでは、異なる文字セット/文字シーケンスを指定できます。

1. データの文字セット/文字シーケンスを設定する

データベースを作成または変更するときに、CHARACTER SET と COLLATE を使用してデータベースの文字セットと照合順序を指定できます。

データベースを作成します。

データベース db_name の作成
 [[デフォルト] 文字セット charset_name]
 [[DEFAULT] COLLATE 照合名]

データベースを変更します。

ALTER DATABASE db_name
 [[デフォルト] 文字セット charset_name]
 [[DEFAULT] COLLATE 照合名]

例: データベース test_schema を作成し、文字セットを utf8 に設定します。デフォルトの照合順序は utf8_general_ci です。

データベース `test_schema` を作成します。デフォルトの文字セットは utf8 です。

2. データベースの文字セット/文字シーケンスを確認する

データベースの文字セット/文字順序を表示するには 3 つの方法があります。

例 1: test_schema の文字セットと照合順序を確認します。 (デフォルトのデータベースを切り替える必要があります)

mysql> test_schema を使用します。
データベースが変更されました
mysql> @@character_set_database、@@collat​​ion_database を選択します。
+--------------------------+----------------------+
| @@文字セットデータベース | @@照合データベース |
+--------------------------+----------------------+
| utf8 | utf8_general_ci |
+--------------------------+----------------------+
セット内の 1 行 (0.00 秒)

例 2: 次のコマンドを使用して、test_schema の文字セットとデータベースを表示することもできます (デフォルトのデータベースを切り替える必要はありません)

mysql> information_schema.SCHEMATA から SCHEMA_NAME、DEFAULT_CHARACTER_SET_NAME、DEFAULT_COLLATION_NAME を選択します。 WHERE schema_name="test_schema";
+-------------+----------------------------+-------------------------+
| スキーマ名 | デフォルトの文字セット名 | デフォルトの照合名 |
+-------------+----------------------------+-------------------------+
| テストスキーマ | utf8 | utf8_general_ci |
+-------------+----------------------------+-------------------------+
セット内の 1 行 (0.00 秒)

例 3: データベースを作成するためのステートメントを表示することで、文字セットを確認することもできます。

mysql> SHOW CREATE DATABASE test_schema;
+-------------+---------------------------------------------------------------------+
| データベース | データベースの作成 |
+-------------+---------------------------------------------------------------------+
| test_schema | CREATE DATABASE `test_schema` /*!40100 デフォルト文字セット utf8 */ |
+-------------+---------------------------------------------------------------------+
セット内の 1 行 (0.00 秒)

3. データベースの文字セットと文字シーケンスはどのように決定されますか?

データベースを作成するときに、CHARACTER SET または COLLATE が指定されている場合は、対応する文字セットと照合順序が優先されます。
データベースを作成するときに、文字セットと照合ルールが指定されていない場合は、character_set_server と collat​​ion_server が優先されます。

6. 表の文字セットと文字列

テーブルを作成および変更するための構文は次のとおりです。文字セットと文字シーケンスは、CHARACTER SET と COLLATE を通じて設定できます。

CREATE TABLE tbl_name (列リスト)
 [[デフォルト] 文字セット charset_name]
 [COLLATE 照合名]]

ALTER TABLE tbl_name
 [[デフォルト] 文字セット charset_name]
 [COLLATE 照合名]

1. テーブルを作成し、文字セット/文字シーケンスを指定します

次の例では、文字セットを utf8 に指定し、文字シーケンスをデフォルトに指定します。

テーブル `test_schema`.`test_table` を作成します (
 `id` INT NOT NULL コメント ''
 主キー (`id`) コメント '')
デフォルト文字セット = utf8;

2. テーブルの文字セット/文字シーケンスを確認する

同様に、テーブルの文字セット/文字順序を表示する方法は 3 つあります。

方法 1: SHOW TABLE STATUS を使用してテーブルの状態を表示します。照合順序は utf8_general_ci であり、対応する文字セットは utf8 であることに注意してください。

MariaDB [ブログ]> SHOW TABLE STATUS FROM test_schema \G;
************************** 1. 行 ****************************
  名前: test_table
  エンジン: InnoDB
 バージョン: 10
 行形式: コンパクト
  行数: 0
 平均行長: 0
 データ長: 16384
最大データ長: 0
 インデックスの長さ: 0
 データ空き容量: 11534336
 自動増分: NULL
 作成時間: 2018-01-09 16:10:42
 更新時間: NULL
 チェック時間: NULL
 照合順序: utf8_general_ci
 チェックサム: NULL
 作成オプション: 
 コメント: 
セット内の 1 行 (0.00 秒)

方法 2: information_schema.TABLES の情報を表示します。

mysql> test_schema を使用します。
mysql> information_schema.TABLES から TABLE_COLLATION を選択します。ここで、TABLE_SCHEMA = "test_schema" AND TABLE_NAME = "test_table" です。
+-----------------+
| テーブル照合 |
+-----------------+
|utf8_general_ci|
+-----------------+

方法 3: SHOW CREATE TABLE で確認します。

mysql> SHOW CREATE TABLE test_table;
+------------+--------------------------------------------------------------------------------------------------------------------------------+
| テーブル | テーブルの作成 |
+------------+--------------------------------------------------------------------------------------------------------------------------------+
| test_table | テーブル `test_table` を作成します (
 `id` int(11) NULLではない、
 主キー (`id`)
) エンジン=InnoDB デフォルト文字セット=utf8 |
+------------+--------------------------------------------------------------------------------------------------------------------------------+
セット内の 1 行 (0.00 秒)

3. 表の文字セットと文字列の決定方法

CHARACTER SETとCOLLATEの値がそれぞれcharset_nameとcollat​​ion_nameであると仮定します。テーブルを作成する場合:

charset_name と collat​​ion_name が指定されている場合は、それらを使用します。
charset_name のみが指定され、collat​​ion_name が指定されていない場合、文字セットは charset_name を使用し、文字シーケンスは charset_name に対応するデフォルトの文字シーケンスを使用します。

collat​​ion_name のみが指定され、charset_name が指定されていない場合、文字シーケンスは collat​​ion_name を使用し、文字セットは collat​​ion_name に関連付けられた文字セットを使用します。

charset_name と collat​​ion_name が指定されていない場合は、データベースの文字セットと照合設定が使用されます。

7. 列の文字セットとソート

CHAR、VARCHAR、または TEXT 型の列の場合、文字セットまたは文字シーケンスを指定できます。構文は次のとおりです。

列名 {CHAR | VARCHAR | TEXT} (列の長さ)
 [文字セット charset_name]
 [COLLATE 照合名]

1. 新しい列を追加し、文字セット/照合ルールを指定します

例は次のとおりです: (テーブルの作成と同様)

mysql> ALTER TABLE test_table ADD COLUMN char_column VARCHAR(25) CHARACTER SET utf8;

2. 列の文字セット/文字シーケンスを確認する

以下にいくつか例を挙げます。

mysql> information_schema.COLUMNS から CHARACTER_SET_NAME、COLLATION_NAME を選択します。WHERE TABLE_SCHEMA="test_schema" AND TABLE_NAME="test_table" AND COLUMN_NAME="char_column";
+--------------------+-----------------+
| 文字セット名 | 照合名 |
+--------------------+-----------------+
| utf8 | utf8_general_ci |
+--------------------+-----------------+
セット内の 1 行 (0.00 秒)

3. 列の文字セット/照合ルールを決定する

CHARACTER SET と COLLATE の値がそれぞれ charset_name と collat​​ion_name であると仮定します。

charset_name と collat​​ion_name の両方がクリアされている場合、文字セットと文字順序は charset_name と collat​​ion_name に基づきます。

charset_name のみが指定され、collat​​ion_name が指定されていない場合、文字セットは charset_name になり、文字シーケンスは charset_name のデフォルトの文字シーケンスになります。

collat​​ion_name のみが指定され、charset_name が指定されていない場合、文字シーケンスは collat​​ion_name になり、文字セットは collat​​ion_name に関連付けられた文字セットになります。

charset_name と collat​​ion_name が指定されていない場合は、テーブルの文字セットと文字シーケンスが優先されます。

8. 選択: 文字セットと文字シーケンスを設定するタイミング

一般的に、次の 3 つの場所で設定できます。

データベースを作成するときに構成されます。

mysql サーバーは起動時に構成されます。

MySQLをソースコードからコンパイルする場合は、コンパイルパラメータで設定します。

1. 方法1: データベース作成時に設定する

この方法はより柔軟かつ安全であり、デフォルトの文字セット/文字シーケンスに依存しません。データベースを作成するときに、文字セット/文字順序を指定します。後でテーブルや列を作成するときに、特に指定しない限り、該当するデータベースの文字セット/文字順序が継承されます。

データベースmydbを作成
 デフォルトの文字セット utf8
 デフォルトの照合 utf8_general_ci;

2. 方法2: MySQLサーバーの起動時間を設定する

MySQL サーバーの起動時に character-set-server と collat​​ion-server が設定されるように、次の構成を追加できます。

mysql クライアントを通じてデータベース/テーブル/列を作成し、文字セット/文字順序を明示的に宣言しない場合は、文字セット サーバー/照合サーバーがデフォルトの文字セット/文字順序として使用されます。

さらに、クライアントとサーバーが接続する際の文字セット/文字順序は、SET NAMES を通じて設定する必要があります。

[mysqld]
文字セットサーバー=utf8
照合サーバー=utf8_general_ci

3. 方法3: MySQLをソースコードからコンパイルするときに、コンパイルパラメータで設定する

コンパイル時に -DDEFAULT_CHARSET と -DDEFAULT_COLLATION が指定されている場合は、次のようになります。

データベースまたはテーブルを作成するときに、デフォルトの文字セット/文字シーケンスとして使用されます。

クライアントがサーバーに接続すると、それがデフォルトの文字セット/文字順序として使用されます。 (NAMESを別途設定する必要はありません)

シェル> cmake . -DDEFAULT_CHARSET=utf8 \
  -DDEFAULT_COLLATION=utf8_general_ci

9. 最後に書く

この記事では、MySQL の文字セットと文字シーケンスに関連する内容を詳しく紹介します。この部分では、主にデータの保存と比較に焦点を当てます。実際のところ、まだカバーされていない非常に重要な部分があります。それは、接続の文字セットと文字シーケンスの設定です。

また、接続文字セットや文字順序の設定が適切でないことが原因で発生するコード文字化けの問題も多数あります。この部分については拡張する内容が多いため、次の記事で説明します。

10. 関連リンク

10.1 文字セットのサポート

https://dev.mysql.com/doc/refman/5.7/en/charset.html

要約する

以上が私があなたに紹介した内容です。お役に立てれば幸いです。ご質問があれば、メッセージを残してください。すぐに返信いたします。また、123WORDPRESS.COM ウェブサイトをサポートしてくださっている皆様にも感謝申し上げます。

以下もご興味があるかもしれません:
  • Mysql の文字セット設定の詳細な分析
  • mysql odbc 文字セット設定(中国語の文字が文字化けして表示される)
  • 徹底的なMysql文字セット設定[エッセンスの組み合わせ]
  • Mysql デフォルト文字セット設定方法(無料インストール版)
  • MySQLの文字セットについては、character_set_client=binaryと設定されています。GBKの場合、テーブル記述が文字化けしてしまいます。
  • 詳細な MySQL 文字セット設定のグラフィックバージョン
  • Docker で MySQL の文字セットを設定する方法
  • MySQL 5.5 に基づく文字セット設定の詳細な説明
  • mysql のよく使用される設定 文字セット エンコーディング、自動補完 (自動プロンプト)、外部ネットワーク IP の監視
  • MYSQLの文字セット設定方法(端末の文字セット)の詳しい説明

<<:  Nginx プロキシを使用してインターネットを閲覧する方法

>>:  Node.js のワーカー スレッドの詳細な理解

推薦する

JS でカルーセル画像を実装するいくつかの方法

カルーセル主なアイデアは次のとおりです。大きなコンテナには、コンテナの幅の整数倍の非常に長いテーブル...

Centos7でファイルをバックアップするときは、バックアップファイルにバックアップの日付を追加します

Linux は、システム内のデバイス、インターフェース、ファイル、スタートアップ、アプリケーション ...

Linux statコマンドの使用

1. コマンドの紹介stat コマンドは、ファイルまたはファイル システムに関する詳細情報を表示する...

JavaScript で外部変数にアクセスするサブ関数の 3 つのソリューション

序文Web ページを作成するときに、次のような状況に遭遇することはよくあります。 <本文>...

一般的な Nginx のテクニックと例の概要

1. 複数サーバーの優先順位たとえば、各サーバー ブロックがポート 80 をリッスンする場合、www...

リンク更新ページと js 更新ページの使用例

1. リンクの使用方法:コードをコピーコードは次のとおりです。 <a href="j...

Vue+Bootstrapでシンプルな学生管理システムを実現

参考までに、vueとbootstrapを使って比較的シンプルな生徒管理システムを作りました。具体的な...

Linux での Jenkins の詳細なインストール手順

目次1. JDKをインストールする2. Jenkinsをインストールする3. Jenkinsの設定を...

GTK ツリービューの原理と使用法の分析

GtkTreeView コンポーネントは、美しい通常のリストやツリーのようなリストを作成できる高度な...

MySQL シリーズ 6 のユーザーと認証

目次チュートリアルシリーズ1. ユーザー管理1. ユーザーアカウント2. アカウントの追加と削除3....

jQueryは画像追従効果を実現します

この記事では、画像フォロー効果を実現するためのjQueryの具体的なコードを参考までに紹介します。具...

tomcat デプロイメント プロジェクトの実装と IDEA との統合

目次Tomcat でプロジェクトを展開する 3 つの方法プロジェクトをwebappsディレクトリに直...

Tomcat 初回展開 Web プロジェクト プロセス図

独自のWebプロジェクトをtomcatディレクトリの下のwebappsディレクトリに配置します。 R...

MySQL 8.0.23 のインストールと設定方法のグラフィックチュートリアル (Win10 の場合)

この記事では、MySQL 8.0.23のインストールと設定方法を参考までに紹介します。具体的な内容は...

MySQLデータベース移行により、大量のデータを迅速にエクスポートおよびインポートできます

データベースの移行は、よく遭遇する問題です。データ量が少ない場合、移行は基本的に問題になりません。実...