さまざまな MySQL テーブルソートルールのエラーの分析

さまざまな MySQL テーブルソートルールのエラーの分析

MySQL が複数のテーブルを結合するときに、次のエラーが報告されます: [Err]1267 – 操作 '= の照合順序 (utf8_general_ci、IMPLICIT) と (utf8_unicode_ci、IMPLICIT) の不正な組み合わせ

これは、2 つのテーブルのソート規則 (COLLATION) が異なり、比較を完了できないことを意味します。 COLLATION は、ソートとサイズの比較に使用されます。文字セットには 1 つ以上の COLLATION があり、_ci (大文字と小文字を区別しない)、_cs (大文字と小文字を区別する)、または _bin (バイナリ) で終わります。比較を行う場合は、両方のテーブルの文字順序が同じであることを確認する必要があります。通常、テーブルを作成するときに指定する必要はありません。デフォルトのものを使用できます。すべてデフォルトを使用しても問題はありません。

さまざまなシナリオをシミュレートしてみましょう。テーブル構造は次のとおりです (utf8 のデフォルトのソート規則は utf8_general_ci です)。

mysql> テーブル test.cs\G の作成を表示します
************************** 1. 行 ****************************
    テーブル: cs
テーブルの作成: CREATE TABLE `cs` (
 `id` int(11) デフォルト NULL,
 `name` varchar(10) デフォルト NULL
) エンジン=InnoDB デフォルト文字セット=utf8
セット内の1行(0.01秒)

テーブルのデフォルトの照合セットを表示する

mysql> information_schema.tables から TABLE_SCHEMA、TABLE_NAME、TABLE_COLLATION を選択します。ここで、table_name='cs' です。
+--------------+------------+-----------------+
| テーブル スキーマ | テーブル名 | テーブル照合 |
+--------------+------------+-----------------+
| テスト | cs | utf8_general_ci |
+--------------+------------+-----------------+
セット内の 1 行 (0.00 秒)

列照合セットの表示

mysql> information_schema.COLUMNS から TABLE_SCHEMA、TABLE_NAME、COLUMN_NAME、COLLATION_NAME を選択します (TABLE_NAME='cs')。
+--------------+------------+-------------+-----------------+
| テーブル スキーマ | テーブル名 | 列名 | 照合名 |
+--------------+------------+--------------+-----------------+
| テスト | cs | id | NULL |
| テスト | cs | 名前 | utf8_general_ci |
+--------------+------------+--------------+-----------------+
セット内の 2 行 (0.00 秒)

utf8 から utf8mb4 へのアップグレードでは、次のようにオンライン DDL はサポートされません。

mysql> ALTER TABLE cs を文字セット utf8mb4 に変換し、ALGORITHM=INPLACE、LOCK=NONE を指定します。
エラー 1846 (0A000): ALGORITHM=INPLACE はサポートされていません。理由: 列タイプ INPLACE を変更できません。ALGORITHM=COPY を試してください。

utf8.utf8_general_ci から utf8.utf8_unicode_ci に変更すると、次のようにオンライン DDL がサポートされなくなります。

mysql> ALTER TABLE cs を文字セット utf8 に変換します。collat​​e utf8_unicode_ci、ALGORITHM=INPLACE、LOCK=NONE;
エラー 1846 (0A000): ALGORITHM=INPLACE はサポートされていません。理由: 列タイプ INPLACE を変更できません。ALGORITHM=COPY を試してください。

次のように文字セットを変更すると、列レベルではなくテーブル レベルのみが変更されることがわかります。

mysql> ALTER TABLE cs CHARACTER SET utf8 collat​​e utf8_unicode_ci;      
クエリは正常、影響を受けた行は 0 行 (0.01 秒)
レコード: 0 重複: 0 警告: 0
 
mysql> information_schema.tables から TABLE_SCHEMA、TABLE_NAME、TABLE_COLLATION を選択します。ここで、table_name='cs' です。      
+--------------+------------+-----------------+
| テーブル スキーマ | テーブル名 | テーブル照合 |
+--------------+------------+-----------------+
| テスト | cs | utf8_unicode_ci |
+--------------+------------+-----------------+
セット内の 1 行 (0.00 秒)
 
mysql> information_schema.COLUMNS から TABLE_SCHEMA、TABLE_NAME、COLUMN_NAME、COLLATION_NAME を選択します (TABLE_NAME='cs')。
+--------------+------------+--------------+-----------------+
| テーブル スキーマ | テーブル名 | 列名 | 照合名 |
+--------------+------------+--------------+-----------------+
| テスト | cs | id | NULL |
| テスト | cs | 名前 | utf8_general_ci |
+--------------+------------+--------------+-----------------+
セット内の 2 行 (0.00 秒)

したがって、実際に文字セットを変更する場合は、次のように CONVERT TO を追加することを忘れないでください。

mysql> ALTER TABLE cs を文字セット utf8 に変換し、 utf8_unicode_ci を照合します。
クエリは正常、5 行が影響を受けました (0.06 秒)
記録: 5 重複: 0 警告: 0
 
mysql> information_schema.COLUMNS から TABLE_SCHEMA、TABLE_NAME、COLUMN_NAME、COLLATION_NAME を選択します (TABLE_NAME='cs')。
+--------------+------------+--------------+-----------------+
| テーブル スキーマ | テーブル名 | 列名 | 照合名 |
+--------------+------------+--------------+-----------------+
| テスト | cs | id | NULL |
| テスト | cs | 名前 | utf8_unicode_ci |
+--------------+------------+--------------+-----------------+
セット内の 2 行 (0.00 秒)

1 つのテーブルのみのデフォルトの文字セットを変更するには、次のステートメントを使用します。

mysql> ALTER TABLE cs default CHARACTER SET utf8 collat​​e utf8_general_ci、ALGORITHM=INPLACE、LOCK=NONE;         
クエリは正常、影響を受けた行は 0 行 (0.00 秒)
レコード: 0 重複: 0 警告: 0
 
mysql> information_schema.tables から TABLE_SCHEMA、TABLE_NAME、TABLE_COLLATION を選択します。ここで、table_name='cs' です。      
+--------------+------------+-----------------+
| テーブル スキーマ | テーブル名 | テーブル照合 |
+--------------+------------+-----------------+
| テスト | cs | utf8_general_ci |
+--------------+------------+-----------------+
セット内の 1 行 (0.00 秒)
 
mysql> information_schema.COLUMNS から TABLE_SCHEMA、TABLE_NAME、COLUMN_NAME、COLLATION_NAME を選択します (TABLE_NAME='cs')。  
+--------------+------------+--------------+-----------------+
| テーブル スキーマ | テーブル名 | 列名 | 照合名 |
+--------------+------------+--------------+-----------------+
| テスト | cs | id | NULL |
| テスト | cs | 名前 | utf8_unicode_ci |
+--------------+------------+-------------+-----------------+
セット内の 2 行 (0.00 秒)

列の文字セットは変更されておらず、新しい列のみがデフォルトでテーブル文字セット (utf8.utf8_general_ci) を継承していることがわかります。

要約する

以上が、MySQL テーブルのソートルールにおけるさまざまなエラー問題の分析に関するこの記事の内容です。皆様のお役に立てれば幸いです。興味のある方は、いくつかの重要な MySQL 変数、MySQL で宣言された変数とストアド プロシージャの分析、MySQL マスター ライブラリ binlog (master-log) とスレーブ ライブラリ relay-log の関係の詳細なコード説明、MySQL 準備原則の詳細な説明などを参照してください。質問がある場合は、いつでもメッセージを残して互いにコミュニケーションを取り、一緒に進歩することができます。

以下もご興味があるかもしれません:
  • MySQL Order By 複数フィールドのソートルールのコード例
  • MySQL の utf8_unicode_ci と utf8_general_ci の違いのまとめ

<<:  Linux で MySQL のデフォルト エンコーディングを変更する方法

>>:  学生情報管理システムを実装するためのJavaScript+HTML

推薦する

JavaScript で Priority Queue を実装する

目次1. 優先キューの紹介2. 優先キューのカプセル化1. 優先キューの紹介通常のキューに要素が挿入...

大規模な MySQL テーブルに対する count() の実装を最適化しました

以下は、B+ ツリーのデータ構造と実験結果からの推測に基づいた私の判断です。間違いがあればご指摘くだ...

Vue 初心者ガイド: 環境の構築と開始方法

目次初期ビューVue開発環境の構築Vueインスタンスの作成Vue テンプレート構文Vue データバイ...

MySQL 5.7.17 zip インストールおよび設定チュートリアル MySQL 起動失敗の解決策

MySQL 5.7.17、現在最新バージョンのようです、ダウンロードアドレスここで、プラットフォーム...

優れたウェブワイヤーフレーム設計・制作ツール13選を紹介

プロジェクトの作業を開始するときは、ワイヤーフレームを使用してアイデアをスケッチすることが重要です。...

MySQL 5.6 での table_open_cache パラメータの最適化と適切な構成の詳細な説明

1. はじめにtable_cache は非常に重要な MySQL パフォーマンス パラメータであり、...

MySQLクエリの冗長インデックスと未使用のインデックス操作

MySQL 5.7 以降のバージョンでは、冗長インデックス、重複インデックス、およびインデックスを使...

JavaScript カスタム カレンダー効果

この記事では、JavaScriptカスタムカレンダーエフェクトの具体的なコードを参考までに紹介します...

標準のMySQL (x64) Windowsバージョンのインストール手順の詳細な説明

MySQL x64 はインストーラーを提供していません、インストーラーを提供していません、インストー...

MySQL 5.7.13 winx64 のインストールと設定方法のグラフィック チュートリアル (win10)

この記事では、参考までにMySQL 5.7.13 winx64のインストールと設定方法のグラフィック...

Vue.js フロントエンドプロジェクト向け多言語ソリューションのアイデアと実践

目次1. 通常どのようなコンテンツを処理する必要があるか2. 基本的な考え方3. 具体的な実践の詳細...

JavaScript でウェブ プレーヤーを実装する

今日は、JavaScript を使用して Web ページ上にプレーヤーを作成する方法を紹介します。誰...

Nginx がフロントエンド リソースへのクロスドメイン アクセスの問題をどのように解決するかの詳細な説明

フロントエンドのクロスドメイン問題に2日間近く悩まされましたが、ようやくngnxを使って解決したので...

Vue2/vue3 ルーティング権限管理方法の例

1. Vueルーティングの権限制御には一般的に2つの方法がありますa. ルーティングメタ情報(メタ)...

Docker で FastDFS ファイル システムを構築する (マルチイメージ チュートリアル)

目次FastDFSについて1. 画像を検索する2. イメージをインストールする3.1. 必要なディレ...