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コンテナ内の設定ファイルの変更の実装

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

推薦する

HTML は、Web ページの作成者が学習して習得しなければならないものです。

HTML を学ぶメリットは何ですか? 1: ウェブサイトやブログのウェブ構造を簡単に変更できます。...

MySQLはbinlogを通じてデータを復元する

目次MySQL ログファイルバイナリログBinlogログがオンになっていますログ記録を有効にする方法...

docker に nacos をインストールしてデータベースを構成する詳細なチュートリアル

環境の準備 Docker環境 MySQL 5.7 (公式イメージはmysql8をサポートしていません...

vue.js を使用してドラッグ アンド ドロップ機能を実装する方法

序文ドラッグ アンド ドロップ機能を追加すると、プログラムがより自然でユーザーフレンドリーになります...

Linux で at および cron スケジュールタスクをカスタマイズする方法

Linux システムには 2 種類のスケジュールされたタスクがあります。1 つは 1 回だけ実行され...

nginx で第 3 レベルドメイン名を設定する方法の例

問題の説明nginx を設定することで、異なるポートを介して異なる Web アプリケーションにアクセ...

MySQLカスタム関数とストアドプロシージャの詳細な説明

序文この記事では主にMySQLのカスタム関数とストアドプロシージャに関する関連コンテンツを紹介し、皆...

テーブルはセルとimg画像を結合してtd HTML全体を埋めます

ソースコード(一部のクラスは削除されています):コードをコピーコードは次のとおりです。 <テー...

AngularでTweenMaxアニメーションライブラリを使用する際の問題と解決策

最近何もすることがないのでCSSをいじっていますより良いアニメーションライブラリTweenMaxを見...

Mysql は、デッドロック問題を解決するために kill コマンドを使用します (実行中の特定の SQL ステートメントを強制終了します)。

MySQL を使用して特定のステートメントを実行すると、データ量が多いためにデッドロックが発生し、...

JavaScript の find() メソッドと filter() メソッドの違いのまとめ

目次序文JavaScript find() メソッドJavaScript filter() メソッド...

CSS の無効な行の高さ設定の問題の解決策

CSS の無効な行の高さ設定についてまず、次のコード文字列を記述します。 <!DOCTYPE ...

フォーム送信時に追加のパラメータを渡すためのいくつかの一般的な方法

フォームを送信するときに、送信前に追加のパラメータが追加される状況が発生する場合があります。この問題...

ウェブサイトに最も必要なのは、ターゲットユーザーグループのエクスペリエンスを向上させることです。

「大河は東に流れ、波は歴代の英雄たちを洗い流した。古城の西側は三国時代の周朗の赤壁だと言われている...

RHEL8 で静的 IP アドレスを設定するさまざまな方法の簡単な分析

Linux サーバーで作業している場合、ネットワーク カード/イーサネット カードに静的 IP アド...