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スペースがいっぱいでコンテナに入れない場合の解決策

推薦する

Vue要素のバックグラウンド認証プロセスの分析

序文:最近、プロジェクトで管理システムに遭遇しました。権限設定が非常に興味深いと思いました。自分の学...

ダイナミックな波効果を実現するSVG+CSS3

ベクトル波 <svg viewBox="0 0 560 20" class...

Dockerの高可用性構成の詳細な説明

Docker の作成Docker Compose は、管理対象コンテナをプロジェクト、サービス、コン...

アイデアを使用して Springboot 初期化サーバーを構築する際の問題分析

問題の説明最近、Springbootプロジェクトを構築していたところ、会社のネットワークケーブルに接...

Linuxシステムはルートアカウントのリモートログインコマンドを禁止しています

ps: Linux システムで root アカウントのリモート ログインを無効にする方法は次のとおり...

Nginx 静的ファイル サービスの構成と最適化の詳細な説明

ルートディレクトリとインデックスファイルroot ディレクティブは、ファイルの検索に使用するルート ...

MySQLとRedisキャッシュ間の同期ソリューションについての簡単な説明

目次1. ソリューション 1 (UDF)デモケース2. ソリューション2(binlogの解析)キャナ...

Linux インストール MySQL チュートリアル (バイナリ配布)

このチュートリアルでは、LinuxにMySQLをインストールする詳細な手順を参考までに紹介します。具...

ffmpeg コマンドラインを使用してビデオを変換するためのサンプルコード

この記事の本文を始める前に、まず ffmpeg プログラムをインストールする必要があります (Lin...

DeepinでPyenvをインストールする手順

序文これまでは、/bin/ ディレクトリのソフトリンクを変更して Python のバージョンを切り替...

ByteDance インタビュー: JS を使用して Ajax 同時リクエスト制御を実装する方法

序文正直に言うと、最近とても混乱していると感じています。テクノロジーと人生について。また、将来の発展...

Docker ファイルの保存パス、コンテナの起動コマンド操作の取得

コンテナはすでに作成されていますが、その起動パラメータ(データがマウントされる場所)を知る方法 #コ...

JavaScript 関数をよりエレガントにする方法

目次分割代入を使用したオブジェクトパラメータコールバック関数の命名条件文を説明的にするスイッチ文をM...

MySQL ロック制御同時実行方法

目次序文1. 楽観的ロックバージョンフィールドを追加する2. 悲観的ロック読み取りロック完全なテーブ...

MySQL のインデックス有効条件とインデックス無効条件の結合

目次1. ジョイントインデックスの故障の条件2. インデックス失敗の条件1. ジョイントインデックス...