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は、サイドナビゲーションバーをタブページに関連付けるサンプルコードを実装します。

目次テクノロジースタック効果分析するテクノロジースタックサイドバー用Antdtabは要素を使用します...

MySQL 5.7.23 解凍バージョンのインストールチュートリアル(画像とテキスト付き)

毎回インストールチュートリアルを探すのは面倒なので、後で確認できるように手順をバックアップします。解...

ナビゲーションデザインと情報アーキテクチャ

<br />ナビゲーションについて話すときは、ほとんどの場合、ナビゲーションがコンテンツ...

CentOS MySQLデータベースのスケジュールバックアップを実装する方法

次のスクリプトは、MySQLデータベース全体のスケジュールされたバックアップに使用されます。 mys...

DockerにRedisをインストールし、パスワードを設定して接続する方法

Redis は分散キャッシュ サービスです。キャッシュは、大規模システムの開発やパフォーマンスの最適...

JavaScript でカウントダウン効果を実装する

カウントダウン効果を実現するにはJavascriptを使用します。参考までに、具体的な内容は次のとお...

MySQL の起動オプションとシステム変数の例の詳細な説明

目次ブートオプションコマンドラインパラメータの長い形式と短い形式設定ファイル構成グループシステム変数...

CentOS8 - bash: 文字化けとその解決方法

この状況は通常、中国語言語パックがインストールされていないか、デフォルトの言語設定に問題があるために...

デザイン理論: デザインにおける階層

<br />原文: http://andymao.com/andy/post/80.ht...

HTML タイトル属性をラップする方法

数日前にプログラムを書いていたとき、プロンプト情報 (TITLE) を新しい行で囲みたいと思いました...

IE6 スペースバグ修正方法

コードを見てみましょう:コードをコピーコードは次のとおりです。 < !DOCTYPE html...

MySQL ユーザーのホスト属性を素早く変更する方法

MySQL にリモートでログインする場合、使用するアカウントには特別な要件があります。アカウントのデ...

良いと思う国内のデザインサイトをいくつか選んでみました。

<br />私が良いと思った国内のデザインサイトをまとめてみました。広告ではありません!...

20個のJavaScriptワンラインコードを共有する

目次1. ブラウザのクッキーの値を取得する2. RGBを16進数に変換する3. クリップボードにコピ...

JavaScript 関数の高度な説明

目次関数定義方法関数呼び出し(6種類)これは問題を指摘している厳密モード高階関数閉鎖再帰: 自分自身...