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

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

推薦する

VirtualBox で作成された Debian 仮想マシンは Windows ホストとファイルを共有します

用語: 1. VM: 仮想マシンステップ: 1. Windows 10 に VirtualBox 6...

MySQLのUPDATE文の落とし穴を記録する

背景最近、オンライン操作中に DML ステートメントを実行しました。これは絶対確実だと思っていました...

私が遭遇したIE8の互換性に関する注意事項

1. IE8 の getElementById は id のみをサポートし、name はサポートしま...

MySQL 8.0.22 zip圧縮パッケージ版(無料インストール)のダウンロード、インストール、および構成手順の詳細

目次最初のステップはMySQLをダウンロードすることですステップ2: ダウンロードした圧縮パッケージ...

Linuxでスクリーンショットを撮って編集するための最高のツール

メインのオペレーティング システムを Windows から Ubuntu に切り替えたとき、最初に考...

プライベートウェアハウス(レジストリとハーバー)を構築するためのDockerの実装

使用される Docker イメージが増えるにつれて、イメージを保存する場所、つまりウェアハウスが必要...

JS を使用してバイナリ ツリー トラバーサル アルゴリズムのサンプル コードを実装する

目次序文1. バイナリツリー1.1. 二分木の走査1.2. jsを使用してバイナリツリーを表現する1...

WeChatアプレットがユーザーの移動軌跡を記録

目次設定を追加json 構成レイヤー構成の表示論理層の構成位置追跡をオンにする録音を開始開始座標を決...

Centos7.3は起動時に自動的に起動または指定されたコマンドを実行します

Centos7では、/etc/rc.d/rc.localファイルの権限が削減されており、実行権限があ...

Linux システムで Centos7 を使って ElasticSearch ミドルウェアと共通インターフェースを構築するデモ

1. ミドルウェアの紹介1. 基本概念ElasticSearch は Lucene をベースにした検...

スケルトンスクリーン効果を実現する CSS

ネットワーク データを読み込むときは、ユーザー エクスペリエンスを向上させるために、通常は円形の読み...

Reactの基本のまとめ

目次序文始めるReactライフサイクルリアクトファイバーリアクトセットステートReactイベントメカ...

dockerエラーの原因分析 終了しました (1) 4分前

Dockerエラー1. 原因を確認するdocker ログ ネクサス2. エラーの原因OpenJDK ...

フィボナッチ数列のJavaScript出力を実装する方法

目次トピック分析する基本的な解決策基本的な再帰再帰最適化要約するトピック私たちが答えなければならない...

Vueデータ監視の原理の詳細な説明

目次1. はじめにII. 監視対象2.1 なぜオブジェクトを監視する必要があるのですか? 2.2 デ...