MySQL における識別子の大文字と小文字の区別の問題の詳細な分析

MySQL における識別子の大文字と小文字の区別の問題の詳細な分析

MySQL では、テーブル名の大文字と小文字の区別の問題が発生する可能性があります。実際、これはプラットフォーム (オペレーティング システム) とシステム変数 lower_case_table_names に関連しています。要約すると、興味があれば公式ドキュメント「識別子の大文字と小文字の区別」を確認してください。

MySQL では、データベースはデータ ディレクトリ内のディレクトリに対応します。データベース内の各テーブルは、データベース ディレクトリ内の少なくとも 1 つのファイルに対応します (ストレージ エンジンによっては、さらに複数のファイルに対応している場合もあります)。トリガーもファイルに対応します。したがって、基盤となるオペレーティング システムの大文字と小文字の区別は、データベース名、テーブル名、およびトリガー名の大文字と小文字の区別に影響します。つまり、Windows ではこのような名前の大文字と小文字は区別されませんが、ほとんどの種類の Unix では大文字と小文字が区別されます。注目すべき例外の 1 つは macOS です。これは Unix ベースですが、大文字と小文字を区別しないデフォルトのファイル システム タイプ (HFS+) を使用します。ただし、macOS は UFS ボリュームもサポートしており、これは他の Unix と同様に大文字と小文字が区別されます。セクション 1.8.1「MySQL の標準 SQL 拡張機能」を参照してください。lower_case_table_names システム変数も、このセクションの後半で説明するように、サーバーが識別子の大文字と小文字の区別を処理する方法に影響します。

MySQL では、データベースはデータ ディレクトリ内のディレクトリに対応します。データベース内の各テーブルは、データベース ディレクトリ内の少なくとも 1 つのファイル (ストレージ エンジンによってはそれ以上のファイル) に対応します。トリガーもファイルに対応します。したがって、基盤となるオペレーティング システムの大文字と小文字の区別は、データベース名、テーブル名、およびトリガー名の大文字と小文字の区別に重要な役割を果たします。つまり、Windows では名前の大文字と小文字は区別されませんが、ほとんどの Unix では大文字と小文字が区別されます。注目すべき例外は macOS です。これは Unix をベースにしていますが、大文字と小文字を区別しないデフォルトのファイル システム タイプ (HFS+) を使用します。ただし、macOS は、他の Unix と同様に大文字と小文字を区別する UFS ボリュームもサポートしています。セクション1.8.1「標準 SQL への MySQL 拡張」を参照してください。このセクションの後半で説明するように、lower_case_table_names システム変数は、サーバーが識別子の大文字と小文字の区別を処理する方法にも影響します。

リナックス:

データベース名とテーブル名では大文字と小文字が厳密に区別されます。
テーブルエイリアスでは大文字と小文字が厳密に区別されます。
列名と列エイリアスでは、大文字と小文字は区別されません。
変数名も厳密に大文字と小文字が区別されます。

ウィンドウズ:

大文字と小文字は区別されません
Mac OS (非UFSボリューム)の場合:
大文字と小文字は区別されません

注: 列名、インデックス、ストアド プロシージャ、およびイベント名は、どのプラットフォームでも大文字と小文字が区別されません。また、列の別名も大文字と小文字が区別されません。

注意: 列名、インデックス名、ストアド ルーチン名、イベント名は、どのプラットフォームでも大文字と小文字が区別されません。列のエイリアスも同様です。

次のテスト環境は、Red Hat Enterprise Linux Server リリース 5.7、MySQL 5.6.20 です。

mysql> 'lower_case_table_names' のような変数を表示します。
+------------------------+-------+
| 変数名 | 値 |
+------------------------+-------+
| 小文字のテーブル名 | 0 |
+------------------------+-------+
セット内の 1 行 (0.00 秒)
マイSQL> 
mysql> mydb を使用します。
データベースが変更されました
mysql> テーブル test(id int) を作成します。
クエリは正常、影響を受けた行は 0 行 (0.07 秒)
mysql> テーブル TEST(id int) を作成します。
クエリは正常、影響を受けた行は 0 行 (0.09 秒)
mysql> テスト値に挿入(1);
クエリは正常、1 行が影響を受けました (0.03 秒)
mysql> TEST値(2)に挿入します。
クエリは正常、1 行が影響を受けました (0.00 秒)
mysql> テストから * を選択します。
+------+
|id|
+------+
| 1 |
+------+
セット内の 1 行 (0.00 秒)
mysql> TEST から * を選択します。
+------+
|id|
+------+
| 2 |
+------+
セット内の 1 行 (0.00 秒)
マイSQL>

設定ファイル my.cnf で lower_case_table_names=1 (1 は大文字と小文字を区別しない、0 は大文字と小文字を区別する) を設定した後、MySQL サービスを再起動して次のテストを実行します。

mysql> mydb を使用します。
テーブル名と列名の補完のためのテーブル情報の読み取り
-Aでこの機能をオフにすると起動が速くなります。
データベースが変更されました
mysql> テストから * を選択します。
+------+
|id|
+------+
| 1 |
+------+
セット内の 1 行 (0.00 秒)
mysql> TEST から * を選択します。
+------+
|id|
+------+
| 1 |
+------+
セット内の 1 行 (0.00 秒)
マイSQL> 

この時点では、test、TEST、Test のいずれであっても、すべて test としてアクセスされていることがわかります。この時点では、「TEST」テーブルにはアクセスできません。システム変数 lower_case_table_names は読み取り専用変数であり、現在のセッションでは変更できません。この設定では、同じテーブル名が存在する場合、mysqldump を使用してデータベースをバックアップするときに次のエラーが発生します。

mysqldump: エラーが発生しました: 1066: LOCK TABLES 使用時にテーブル/エイリアスが一意ではありません: 'test'

この状況は非常に厄介です。設定ファイル my.cnf で変数 lower_case_table_names=0 を設定し、MySQL サービスを再起動する必要があります。したがって、このような問題を回避するには、事前に計画を立て、統一された命名規則を使用することが非常に重要です。さらに、システム変数 lower_case_table_names には 0、1、2 の 3 つの値があります。

1. 0 に設定: テーブル名は、記述した SQL と同じ大文字と小文字で保存され、大文字は大文字、小文字は小文字となり、比較では大文字と小文字が区別されます。

2. 1 に設定: テーブル名は小文字に変換されてディスクに保存され、比較では大文字と小文字が区別されません。

3. 2 に設定: テーブル名は、記述した SQL の大文字と小文字に従って保存され、大文字は大文字、小文字は小文字となり、比較時にすべて小文字に変換されます。


データベース名の大文字と小文字の区別に関しては、次の問題が発生する可能性があります。

1: エラー 1010 (HY000): データベースの削除エラー ('./xxxx' を rmdir できません、エラー番号: 39)

1: エラー 1010 (HY000): データベースの削除エラー ('./xxxx' を rmdir できません、エラー番号: 39)

mysql> データベースを表示します。
+--------------------+
| データベース |
+--------------------+
| 情報スキーマ |
|マイDB|
| マイデータベース |
|mysql |
| パフォーマンススキーマ |
|tモニター|
| 翔潤 |
+--------------------+
セット内の行数は 7 です (0.01 秒)
mysql> 'lower_case_table_names' のような変数を表示します。
+------------------------+-------+
| 変数名 | 値 |
+------------------------+-------+
| 小文字のテーブル名 | 1 |
+------------------------+-------+
セット内の 1 行 (0.00 秒)
mysql> データベース mydb を削除します。
エラー 1010 (HY000): データベースの削除エラー ('./mydb' を rmdir できません、エラー番号: 39)
マイSQL>

解決策: 構成ファイル my.cnf で変数 lower_case_table_names=0 を設定し、MySQL サービスを再起動すると、データベースを削除できます。

2: エラー 1049 (42000): 不明なデータベース 'xxx'

mysql> 'lower_case_table_names' のような変数を表示します。
+------------------------+-------+
| 変数名 | 値 |
+------------------------+-------+
| 小文字のテーブル名 | 1 |
+------------------------+-------+
セット内の1行(0.01秒)
マイSQL> 
mysql> データベースを表示します。
+--------------------+
| データベース |
+--------------------+
| 情報スキーマ |
|マイDB|
|mysql |
| パフォーマンススキーマ |
|tモニター|
| 翔潤 |
+--------------------+
セット内の6行(0.01秒)
mysql> MyDB を使用します。
エラー 1049 (42000): 不明なデータベース 'mydb'
マイSQL>

参考文献:

https://dev.mysql.com/doc/refman/5.7/en/identifier-case-sensitivity.html

要約する

上記は、私が紹介した MySQL の識別子の大文字と小文字の区別の問題です。お役に立てば幸いです。ご質問がある場合は、メッセージを残してください。すぐに返信いたします。また、123WORDPRESS.COM ウェブサイトをサポートしてくださっている皆様にも感謝申し上げます。

以下もご興味があるかもしれません:
  • MySQLの場合の使用例分析
  • MySQL ストアド プロシージャで case ステートメントを使用する詳細な例
  • MySQLソートにおけるCASE WHENの使用例
  • MySQL のグループ分けの例
  • Mysql のケースと使用方法の詳細な説明
  • mysql 更新ケース更新フィールド値が固定されていない操作

<<:  Dockerコンテナ内の設定ファイルの変更の実装

>>:  キャンバスをベースにした超クールな水光効果を実現

推薦する

JavaScript の矢印関数と通常の関数の違いの詳細な説明

この記事では、JavaScriptにおけるアロー関数と通常の関数の違いについて解説します。具体的な内...

MySQL の厄介な Aborted 警告をケーススタディで分析する

この記事では主に、MySQL の Aborted アラームに関する関連コンテンツを紹介し、参考と学習...

docker-compose.yml ファイル内の一般的なテンプレート コマンドの詳細な説明

注意: docker-compose.yml ファイルを書き込むときは、すべてのコロン (:) とダ...

HTML要素を非表示にするいくつかの方法

1. CSSを使用するコードをコピーコードは次のとおりです。スタイル="display:n...

Vueでアイコンをカスタマイズする手順

ant-design-vue は Ali iconfont icons の使用をカスタマイズします\...

レスポンシブレイアウトについて知っておくべきこと

1. はじめにレスポンシブ Web デザインにより、Web サイトは複数のデバイスと複数の画面に同時...

MySQL Strict Modeの知識ポイントの詳細な説明

I. 厳密モードの説明MySQL 5.0 以降の厳密モード (STRICT_TRANS_TABLES...

Vue2.0+ElementUI+PageHelperで実装されたテーブルページング機能

序文最近、いくつかのフロントエンド プロジェクトに取り組んでおり、ページにいくつかのテーブルを表示す...

Linux でのスケジュールされたタスクと遅延タスクの詳細な説明

で+ 時間 17:23に at> touch /mnt/file{1..9} ##アクションを...

ネイティブJavaScriptでカルーセルを実装する

この記事では、JavaScriptでカルーセルを実装するための具体的なコードを参考までに紹介します。...

ポップアップ効果を実現するにはjsを使用します

この記事の例では、ポップアップ効果を実現するためのjsの具体的なコードを参考までに共有しています。具...

mysql 計算関数の詳細

目次2. フィールドの連結2. MySQL関数の例をいくつか挙げてください。 2.1 シンボル処理2...

MySQL の char、varchar、text フィールド タイプの違い

MySQL では、char、varchar、text の各タイプのフィールドはすべて文字タイプのデー...

ビューポートの基本原理と詳細な使用方法

1. ビューポートの概要モバイル ブラウザは通常、画面よりも幅の広い仮想ウィンドウにページをレンダリ...

mybatis-plusページングパラメータが渡された後、SQLのwhere条件にはページング情報操作の制限がありません

2時間近くかけて、さまざまな方法を試しました。後で、whereでフィルタリングした後のデータ量が1ペ...