1. コンテンツの概要MySQL を使用する場合、文字セットと文字シーケンスの概念、およびさまざまな設定がデータの保存と比較に与える影響を理解することが非常に重要です。多くの学生が日常業務で遭遇する「文字化け」の問題は、文字セットと文字シーケンスの理解不足や設定の誤りによって発生する可能性が最も高いです。 この記事では、基本的な内容から複雑な内容まで、以下の内容を紹介します。
2. 文字セットと文字順序の概念と関係データを保存するときに、MySQL はさまざまな文字セットをサポートします。データを比較する場合、異なる文字順序のサポートが提供されます。 MySQL は、サーバー レベル、データベース レベル、テーブル レベル、列レベルなど、さまざまなレベルで設定を提供し、非常に正確な設定を行うことができます。 文字セットと文字シーケンスとは何ですか?簡単に言えば:
例えば: 文字は 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 つの比較規則が定義されており、これらの比較規則のセットが照合です。
3. MySQL でサポートされている文字セットと文字シーケンスMySQL は複数の文字セットと文字シーケンスをサポートしています。
上記はかなり抽象的です。何が起こっているかを理解するために、次のいくつかのセクションを見てみましょう。 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 と collation_server は、それぞれサーバー文字セットとサーバー文字シーケンスに対応します。 1. サーバーの文字セットと文字シーケンスを確認する これらはそれぞれ、character_set_server および collation_server システム変数に対応します。 mysql> "character_set_server"のような変数を表示します。 mysql> "collation_server"のような変数を表示します。 2. サービスを開始するときに指定する MySQL サービスを起動するときに、サーバーの文字セットと文字シーケンスを指定できます。指定しない場合、デフォルトの文字順序はlatin1、latin1_swedish_ciです。 mysqld --character-set-server=latin1 \ --collation-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 と collation_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、@@collation_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 が指定されている場合は、対応する文字セットと照合順序が優先されます。 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とcollation_nameであると仮定します。テーブルを作成する場合: charset_name と collation_name が指定されている場合は、それらを使用します。 collation_name のみが指定され、charset_name が指定されていない場合、文字シーケンスは collation_name を使用し、文字セットは collation_name に関連付けられた文字セットを使用します。 charset_name と collation_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 と collation_name であると仮定します。 charset_name と collation_name の両方がクリアされている場合、文字セットと文字順序は charset_name と collation_name に基づきます。 charset_name のみが指定され、collation_name が指定されていない場合、文字セットは charset_name になり、文字シーケンスは charset_name のデフォルトの文字シーケンスになります。 collation_name のみが指定され、charset_name が指定されていない場合、文字シーケンスは collation_name になり、文字セットは collation_name に関連付けられた文字セットになります。 charset_name と collation_name が指定されていない場合は、テーブルの文字セットと文字シーケンスが優先されます。 8. 選択: 文字セットと文字シーケンスを設定するタイミング一般的に、次の 3 つの場所で設定できます。 データベースを作成するときに構成されます。 mysql サーバーは起動時に構成されます。 MySQLをソースコードからコンパイルする場合は、コンパイルパラメータで設定します。 1. 方法1: データベース作成時に設定する この方法はより柔軟かつ安全であり、デフォルトの文字セット/文字シーケンスに依存しません。データベースを作成するときに、文字セット/文字順序を指定します。後でテーブルや列を作成するときに、特に指定しない限り、該当するデータベースの文字セット/文字順序が継承されます。 データベースmydbを作成 デフォルトの文字セット utf8 デフォルトの照合 utf8_general_ci; 2. 方法2: MySQLサーバーの起動時間を設定する MySQL サーバーの起動時に character-set-server と collation-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 ウェブサイトをサポートしてくださっている皆様にも感謝申し上げます。 以下もご興味があるかもしれません:
|
<<: Nginx プロキシを使用してインターネットを閲覧する方法
カルーセル主なアイデアは次のとおりです。大きなコンテナには、コンテナの幅の整数倍の非常に長いテーブル...
Linux は、システム内のデバイス、インターフェース、ファイル、スタートアップ、アプリケーション ...
1. コマンドの紹介stat コマンドは、ファイルまたはファイル システムに関する詳細情報を表示する...
序文Web ページを作成するときに、次のような状況に遭遇することはよくあります。 <本文>...
1. 複数サーバーの優先順位たとえば、各サーバー ブロックがポート 80 をリッスンする場合、www...
1. リンクの使用方法:コードをコピーコードは次のとおりです。 <a href="j...
参考までに、vueとbootstrapを使って比較的シンプルな生徒管理システムを作りました。具体的な...
目次1. JDKをインストールする2. Jenkinsをインストールする3. Jenkinsの設定を...
GtkTreeView コンポーネントは、美しい通常のリストやツリーのようなリストを作成できる高度な...
目次チュートリアルシリーズ1. ユーザー管理1. ユーザーアカウント2. アカウントの追加と削除3....
この記事では、画像フォロー効果を実現するためのjQueryの具体的なコードを参考までに紹介します。具...
目次Tomcat でプロジェクトを展開する 3 つの方法プロジェクトをwebappsディレクトリに直...
独自のWebプロジェクトをtomcatディレクトリの下のwebappsディレクトリに配置します。 R...
この記事では、MySQL 8.0.23のインストールと設定方法を参考までに紹介します。具体的な内容は...
データベースの移行は、よく遭遇する問題です。データ量が少ない場合、移行は基本的に問題になりません。実...