MySQL 文字セットの概要

MySQL 文字セットの概要

このノートは主にMySQLの文字セットに関する知識の学習を記録します

文字セット

通常、テーブルを作成するには次のステートメントを使用し、テーブルの作成時に文字セットを utf8 エンコーディングとして指定します。

テーブル「test」を作成します(
 `c1` int UNSIGNED NOT NULL AUTO_INCREMENT,
 `c2` varchar(255)、
 `c3` 文字(11)、
 `c4` varchar(255)、
 主キー (`c1`)
)ENGINE=InnoDB デフォルト文字セット=utf8;

しかし実際には、MySQL は utf8 以外の文字セットもサポートしています。コマンド show charset を使用すると、現在 MySQL でサポートされているすべての文字セットを表示できます。

たとえば、次の図は、MySQL でサポートされているすべての文字セットを示しています。

上の図からわかるように、4 番目の列は文字セットの最大長を示しています。 MySQL では、テーブルを作成するときによく使用される utf8 の最大長は、実際には 3 文字です。 utf8 は 1 ~ 4 文字を使用して特定のコンテンツを表すと一般的に考えられていますが、MySQL における utf8 は実際には utf8mb3 の別名です。MySQL で最大 4 文字を使用する正規のものは utf8mb4 です。

知らせ:

utf8mb4
utf8mb4

比較ルール

上の図では、3 番目の列の「デフォルトの照合」がこれらの文字セットのデフォルトの比較ルールです。たとえば、acsii 文字セットのデフォルトの比較ルールは ascii_general_ci であり、utf8 文字セットのデフォルトの比較ルールは utf8_general_ci です。

実際、各文字セットには多くの比較規則があります。たとえば、次の図に示すように、acsii文字セットの比較規則を見てみましょう。

mysql> 'ascii%' のような照合順序を表示します。
+------------------+---------+----+----------+----------+----------+
| 照合 | 文字セット | ID | デフォルト | コンパイル済み | ソート長 |
+------------------+---------+----+----------+----------+----------+
| ascii_general_ci | ascii | 11 | はい | | 0 |
| ascii_bin | ascii | 65 | | | 0 |
+------------------+---------+----+----------+----------+----------+

ascii_general_ci は一般的な比較を示し、_ci は大文字と小文字を区別しないことを意味します。 (逆に、_csは大文字と小文字を区別することを意味します)

ascii_binはバイナリ比較を意味します

次の図に示すように、utf8とutf8mb4の文字セットの比較規則を見てみましょう。

mysql> 'utf8%' のような照合順序を表示します。
+--------------------------+---------+-----+----------+----------+----------+
| 照合 | 文字セット | ID | デフォルト | コンパイル済み | ソート長 |
+--------------------------+---------+-----+----------+----------+----------+
| utf8_general_ci | utf8 | 33 | はい | はい | 1 |
| utf8_bin | utf8 | 83 | | はい | 1 |
| utf8_unicode_ci | utf8 | 192 | | はい | 8 |
| utf8_icelandic_ci | utf8 | 193 | | はい | 8 |
| utf8_latvian_ci | utf8 | 194 | | はい | 8 |
| utf8_romanian_ci | utf8 | 195 | | はい | 8 |
| utf8_slovenian_ci | utf8 | 196 | | はい | 8 |
| utf8_polish_ci | utf8 | 197 | | はい | 8 |
| utf8_estonian_ci | utf8 | 198 | | はい | 8 |
| utf8_spanish_ci | utf8 | 199 | | はい | 8 |
| utf8_swedish_ci | utf8 | 200 | | はい | 8 |
| utf8_turkish_ci | utf8 | 201 | | はい | 8 |
| utf8_czech_ci | utf8 | 202 | | はい | 8 |
| utf8_danish_ci | utf8 | 203 | | はい | 8 |
| utf8_lithuanian_ci | utf8 | 204 | | はい | 8 |
| utf8_slovak_ci | utf8 | 205 | | はい | 8 |
| utf8_spanish2_ci | utf8 | 206 | | はい | 8 |
| utf8_roman_ci | utf8 | 207 | | はい | 8 |
| utf8_persian_ci | utf8 | 208 | | はい | 8 |
| utf8_esperanto_ci | utf8 | 209 | | はい | 8 |
| utf8_hungarian_ci | utf8 | 210 | | はい | 8 |
| utf8_sinhala_ci | utf8 | 211 | | はい | 8 |
| utf8_german2_ci | utf8 | 212 | | はい | 8 |
| utf8_croatian_ci | utf8 | 213 | | はい | 8 |
| utf8_unicode_520_ci | utf8 | 214 | | はい | 8 |
| utf8_vietnamese_ci | utf8 | 215 | | はい | 8 |
| utf8_general_mysql500_ci | utf8 | 223 | | はい | 1 |
| utf8mb4_general_ci | utf8mb4 | 45 | はい | はい | 1 |
| utf8mb4_bin | utf8mb4 | 46 | | はい | 1 |
| utf8mb4_unicode_ci | utf8mb4 | 224 | | はい | 8 |
| utf8mb4_icelandic_ci | utf8mb4 | 225 | | はい | 8 |
| utf8mb4_latvian_ci | utf8mb4 | 226 | | はい | 8 |
| utf8mb4_romanian_ci | utf8mb4 | 227 | | はい | 8 |
| utf8mb4_slovenian_ci | utf8mb4 | 228 | | はい | 8 |
| utf8mb4_polish_ci | utf8mb4 | 229 | | はい | 8 |
| utf8mb4_estonian_ci | utf8mb4 | 230 | | はい | 8 |
| utf8mb4_spanish_ci | utf8mb4 | 231 | | はい | 8 |
| utf8mb4_swedish_ci | utf8mb4 | 232 | | はい | 8 |
| utf8mb4_turkish_ci | utf8mb4 | 233 | | はい | 8 |
| utf8mb4_czech_ci | utf8mb4 | 234 | | はい | 8 |
| utf8mb4_danish_ci | utf8mb4 | 235 | | はい | 8 |
| utf8mb4_lithuanian_ci | utf8mb4 | 236 | | はい | 8 |
| utf8mb4_slovak_ci | utf8mb4 | 237 | | はい | 8 |
| utf8mb4_spanish2_ci | utf8mb4 | 238 | | はい | 8 |
| utf8mb4_roman_ci | utf8mb4 | 239 | | はい | 8 |
| utf8mb4_persian_ci | utf8mb4 | 240 | | はい | 8 |
| utf8mb4_esperanto_ci | utf8mb4 | 241 | | はい | 8 |
| utf8mb4_hungarian_ci | utf8mb4 | 242 | | はい | 8 |
| utf8mb4_sinhala_ci | utf8mb4 | 243 | | はい | 8 |
| utf8mb4_german2_ci | utf8mb4 | 244 | | はい | 8 |
| utf8mb4_croatian_ci | utf8mb4 | 245 | | はい | 8 |
| utf8mb4_unicode_520_ci | utf8mb4 | 246 | | はい | 8 |
| utf8mb4_vietnamese_ci | utf8mb4 | 247 | | はい | 8 |
+--------------------------+---------+-----+----------+----------+----------+

異なる比較ルールを使用してデータを比較すると、結果が異なる場合があります。

文字セットと比較ルールは互いに対応しています。文字セットのみを変更しても、比較ルールのみを変更しても、もう一方はそれに応じて自動的に変更されます。

4つのレベルの文字セットと比較規則

文字セットと比較ルールについては上記で説明しました。実際、MySQL にはさまざまなレベルの文字セットと比較ルールがあります。

  • サーバーレベル
  • データベースレベル
  • テーブルレベル
  • 列レベル

サーバーレベルの文字セットについては、パラメータ character_set_server を参照してください。サーバーレベルの比較ルールについては、パラメータ collat​​ion_server を参照してください。

mysql> 'character_set_server' のような変数を表示します。
+----------------------+-------+
| 変数名 | 値 |
+----------------------+-------+
| 文字セットサーバー | utf8 |
+----------------------+-------+
セット内の 1 行 (0.00 秒)

mysql> 'collat​​ion_server' のような変数を表示します。
+------------------+-----------------+
| 変数名 | 値 |
+------------------+-----------------+
| 照合サーバー | utf8_general_ci |
+------------------+-----------------+
セット内の 1 行 (0.00 秒)

データベース レベルで文字セットと比較ルールを表示する場合は、まず xxxdb を使用して特定のデータベースに切り替え、次に show variables like 'character_set_database' と show variables like 'collat​​ion_database' を実行して、データベースの文字セットと比較ルールを表示します。

データベースが変更されました
mysql> 'character_set_database' のような変数を表示します。
+------------------------+-------+
| 変数名 | 値 |
+------------------------+-------+
| 文字セットデータベース | utf8 |
+------------------------+-------+
セット内の 1 行 (0.00 秒)

mysql> 'collat​​ion_database' のような変数を表示します。
+--------------------+-----------------+
| 変数名 | 値 |
+--------------------+-----------------+
| 照合データベース | utf8_general_ci |
+--------------------+-----------------+
セット内の 1 行 (0.00 秒)

テーブルまたはテーブル内の列の文字セットと比較ルールを表示する場合は、show create table xxxtb を使用して、使用されている文字セットと比較ルールを含む特定のテーブル作成ステートメントを表示できます。

データベースの作成時に文字セットと比較規則が指定されていない場合は、サーバー レベルの文字セットと比較規則がデータベースの文字セットと比較規則として使用されます。テーブルの作成または変更のステートメントで文字セットと比較規則が指定されていない場合は、テーブルが配置されているデータベースの文字セットと比較規則が、テーブルの文字セットと比較規則として使用されます。

3つのシステム変数

MySQL サーバーは複数のクライアントに対応できます。これらのクライアントのエンコード方式は異なる場合がありますが、データベース内のデータの文字セットは一定です。MySQL は、異なるクライアントに対してエンコード変換処理を実行し、その結果をクライアントに返す必要があります。

MySQL には、上記の操作を実行できる 3 つの SESSION レベルのシステム変数があります。

  • character_set_client : サーバーがクライアントのリクエストをデコードするために使用する文字セット
  • character_set_connection: サーバーがリクエストを処理するとき、リクエスト文字列をcharacter_set_clientからcharacter_set_connectionに変換します。
  • character_set_results : サーバーがクライアントにデータを返すときに使用する文字セット

MySQL サーバーは、各クライアントのセッション レベルでこれら 3 つの変数のコピーを保持します。

しかし、実際の運用環境ではトラブルを避けるため、企業側ではクライアント側がデフォルトで utf8 文字セットを使用するよう規定しているケースが一般的です。

上記はMySQLの文字セットの詳細な概要です。MySQLの文字セットの詳細については、123WORDPRESS.COMの他の関連記事に注目してください。

以下もご興味があるかもしれません:
  • MySQL 文字セットの変更に関する実践的なチュートリアル
  • MYSQLの文字セット設定方法(端末の文字セット)の詳しい説明
  • MySQLの文字セットと検証ルールの詳細な説明
  • MySQL 文字セットの表示と変更のチュートリアル
  • MySQLの文字セットを変更する方法
  • MySQL データベースの文字化け問題の原因と解決策
  • MySQL の文字セット utf8 を utf8mb4 に変更する方法
  • 既存のMySQLデータベースの文字セットを統一する方法
  • MySQL 文字セットの文字化けとその解決方法
  • MySQL utf8mb4 文字セットの JDBC 処理の詳細な説明
  • MAC で MySQL のデフォルトの文字セットを utf8 に変更する方法

<<:  CSS を使用して複数の方法で等高レイアウトを実装するサンプル コード

>>:  Dockerスペースがいっぱいでコンテナに入れない場合の解決策

推薦する

React Hooks の一般的な使用シナリオ (概要)

目次1. ステートフック1. 基本的な使い方2. 更新3. 合併を実現する4. 遅延初期化状態5. ...

SQL ストアド プロシージャの取得、データ取得、プロセス分析

この記事は主に、SQL のストアド プロシージャから返されたデータを取得するプロセスの分析を紹介しま...

テーブルを使用してフォームコントロールの形式を調整し、見栄えを良くします。

自分でウェブページを書きたいので、HTML 言語についても少し勉強しています。これは、大学時代にウェ...

Docker ベースの MySQL マスタースレーブレプリケーション環境を構築するための実装手順

1. はじめに以前のプログラム アーキテクチャは次の形式になります。プログラムのサイズが大きくなると...

MySQL分離の使用手順を読む

現在のトランザクションはどの履歴バージョンを読み取ることができますか?読み取りビューは、トランザクシ...

ウェブページ制作をマスターするために必要な6つのスキルのまとめ

ウェブデザイナーはジェネラリストであると言わざるを得ません。グラフィックデザイナーは、さまざまな特殊...

Linux で gdb を使用してコア ファイルをデバッグする方法

1.コアファイルプログラム実行中にセグメンテーション エラー (コア ダンプ) が発生すると、プログ...

MySQL における悲観的ロックと楽観的ロック

リレーショナル データベースでは、悲観的ロックと楽観的ロックがリソース同時実行シナリオのソリューショ...

MySQL のジオメトリ型を使用して経度と緯度の距離の問題を処理する方法

テーブルを作成する テーブル `map` を作成します ( `id` int(11) NULLではな...

Hyper-v仮想マシンを使用してCentos7をインストールする

目次導入準備するシステムイメージをダウンロードHyper-Vを有効にする新しい仮想ネットワークスイッ...

Docker Composeのデプロイと基本的な使い方の詳しい説明

1. Docker Composeの概要Compose は、マルチコンテナ Docker アプリケー...

MySQLのサブクエリユニオンの効率性についての簡単な説明と

最近の製品テストでは、同時呼び出し数が 10 未満の場合に応答時間が 100 ミリ秒以内に維持できな...

Vue プロジェクトに Electron を追加するための詳細なコード

1. package.jsonに追加する "メイン": "electr...

MySQL インデックス プッシュダウンの詳細

目次1. 左端接頭辞原則2. 表に戻る3. インデックスプッシュダウン序文:インデックス プッシュダ...

Docker Composeを使用してDOCleverをインストールする詳細なプロセスを説明します

目次1. Docker Composeとは何か、インストールして使用する方法2. DOCleverと...