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 に変換します。collate utf8_unicode_ci、ALGORITHM=INPLACE、LOCK=NONE; エラー 1846 (0A000): ALGORITHM=INPLACE はサポートされていません。理由: 列タイプ INPLACE を変更できません。ALGORITHM=COPY を試してください。 次のように文字セットを変更すると、列レベルではなくテーブル レベルのみが変更されることがわかります。 mysql> ALTER TABLE cs CHARACTER SET utf8 collate 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 collate 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 準備原則の詳細な説明などを参照してください。質問がある場合は、いつでもメッセージを残して互いにコミュニケーションを取り、一緒に進歩することができます。 以下もご興味があるかもしれません:
|
<<: Linux で MySQL のデフォルト エンコーディングを変更する方法
>>: 学生情報管理システムを実装するためのJavaScript+HTML
目次1. 優先キューの紹介2. 優先キューのカプセル化1. 優先キューの紹介通常のキューに要素が挿入...
以下は、B+ ツリーのデータ構造と実験結果からの推測に基づいた私の判断です。間違いがあればご指摘くだ...
目次初期ビューVue開発環境の構築Vueインスタンスの作成Vue テンプレート構文Vue データバイ...
MySQL 5.7.17、現在最新バージョンのようです、ダウンロードアドレスここで、プラットフォーム...
プロジェクトの作業を開始するときは、ワイヤーフレームを使用してアイデアをスケッチすることが重要です。...
1. はじめにtable_cache は非常に重要な MySQL パフォーマンス パラメータであり、...
MySQL 5.7 以降のバージョンでは、冗長インデックス、重複インデックス、およびインデックスを使...
この記事では、JavaScriptカスタムカレンダーエフェクトの具体的なコードを参考までに紹介します...
MySQL x64 はインストーラーを提供していません、インストーラーを提供していません、インストー...
この記事では、参考までにMySQL 5.7.13 winx64のインストールと設定方法のグラフィック...
目次1. 通常どのようなコンテンツを処理する必要があるか2. 基本的な考え方3. 具体的な実践の詳細...
今日は、JavaScript を使用して Web ページ上にプレーヤーを作成する方法を紹介します。誰...
フロントエンドのクロスドメイン問題に2日間近く悩まされましたが、ようやくngnxを使って解決したので...
1. Vueルーティングの権限制御には一般的に2つの方法がありますa. ルーティングメタ情報(メタ)...
目次FastDFSについて1. 画像を検索する2. イメージをインストールする3.1. 必要なディレ...