さまざまな 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の構文とコード構造に関する深い理解

目次概要機能性と読みやすさ空白括弧セミコロンインデント身元大文字と小文字を区別予約キーワード概要すべ...

Navicat Premium が MySQL 8.0 に接続してエラー「1251」を報告する問題を解決する方法の分析

長い間何もしていなかった人は、努力をすると一生懸命働いていると思うようになります。 1. 問題Nav...

画像ファイルの形式とその選択方法

1. どの 3 つの形式ですか?それぞれ、gif、jpg、png です。画像ファイルを最適化すること...

MAC での MYSQL5.7.17 接続失敗の問題と解決策

MYSQL5.7.17 が MAC で接続できない問題。SQLBench_community 6.3...

CSS3 境界効果

CSSとは# CSS (Cascading Style Sheets の略) は、「カスケーディング...

Win10 の Linux サブシステムを有効にする方法を説明します (詳細な画像とテキスト付き)

今日は、Windows 10 で Linux サブシステムを有効にする方法を紹介します。早速、手順を...

Nginxを使用してストリーミングメディアサーバーを構築し、ライブブロードキャスト機能を実現する

前面に書かれた近年、ライブストリーミング業界は非常に人気が高まっています。伝統的な業界でのライブスト...

JavaScript を使用して動的に生成されるテーブルの詳細な説明

*ページを作成する: 2つの入力ボックスとボタン*コードと手順/* 1. 入力行と列の値を取得する2...

テーブルを使用してフォームコントロールの形式を調整し、見栄えを良くします。

自分でウェブページを書きたいので、HTML 言語についても少し勉強しています。これは、大学時代にウェ...

JavaScript は詳細なコードで星座クエリ機能を実装します

目次1. タイトル2. コード3. 結果IV. 結論1. タイトルテキスト ボックスに誕生日の値を入...

ボタンをEnterキーに関連付けるjsコード

コードをコピーコードは次のとおりです。 <html> <ヘッド> <ス...

dockerを使用してTomcatをデプロイし、Skywalkingに接続する

目次1. 概要2. dockerを使用してTomcatをデプロイし、Skywalkingに接続する要...

Docker を使用して ELK ログ システムを構築する例

以下のインストールではすべて、インストール ルート ディレクトリとして ~/ ディレクトリが使用され...

LinuxにNginxをインストールする詳細な手順

1. Nginxのインストール手順1.1 公式サイトの紹介http://nginx.org/en/d...

MySQLデータのセキュリティを確保するための提案

データは企業の中核資産であり、企業にとって最も重要なタスクの 1 つです。注意しないと、データが意図...