MySQL テーブル名の大文字と小文字の選択

MySQL テーブル名の大文字と小文字の選択

1. 大文字と小文字の区別を決定するパラメータ

MySQL では、データベースはデータ ディレクトリ内のディレクトリに対応します。データベース内の各テーブルは、データベース ディレクトリ内の少なくとも 1 つのファイル (ストレージ エンジンによっては複数のファイル) に対応します。したがって、オペレーティング システムの大文字と小文字の区別によって、データベースが大文字と小文字を区別するかどうかが決まります。Windows システムでは大文字と小文字は区別されませんが、Linux システムでは大文字と小文字が区別されます。

デフォルトでは、ライブラリ テーブル名は Windows システムでは大文字と小文字が区別されませんが、Linux システムでは大文字と小文字が区別されます。列名、インデックス名、ストアド プロシージャ、関数、およびイベント名は、どのオペレーティング システムでも大文字と小文字が区別されません。また、列の別名も大文字と小文字が区別されません。

さらに、MySQL には lower_case_table_names システム変数も用意されており、これはテーブル名とデータベース名がディスク上に保存される方法と、MySQL でどのように使用されるかに影響します。Linux システムではこのパラメータのデフォルト値は 0 に設定され、Windows システムではデフォルト値は 1 に設定され、macOS システムではデフォルト値は 2 に設定されています。それぞれの値の具体的な意味を見てみましょう。

価値

意味

0

ライブラリ名とテーブル名は、作成ステートメントで指定された大文字と小文字でディスクに保存され、名前の比較では大文字と小文字が区別されます。

1

ライブラリ名とテーブル名はディスク上に小文字で保存され、名前の比較では大文字と小文字は区別されません。 MySQL は、テーブル名を保存および検索するときに、すべてのテーブル名を小文字に変換します。この動作は、データベース名とテーブル別名にも適用されます。

2

データベース名とテーブル名は、create ステートメントで指定された大文字と小文字でディスクに保存されますが、MySQL は検索時にそれらを小文字に変換します。名前の比較では大文字と小文字は区別されません。

lower_case_table_names パラメータを 2 に設定することはまれなので、以下では 0 または 1 に設定されている場合についてのみ説明します。 Linux のデフォルト値は 0 で、大文字と小文字を区別することを意味します。lower_case_table_names が 0 の場合のデータベースの具体的なパフォーマンスを見てみましょう。

# パラメータ設定の表示mysql> show variables like 'lower_case_table_names';
+------------------------+-------+
| 変数名 | 値 |
+------------------------+-------+
| 小文字のテーブル名 | 0 |
+------------------------+-------+

# データベースを作成します。mysql> create database TestDb;
クエリは正常、1 行が影響を受けました (0.01 秒)

mysql> データベース testdb を作成します。
クエリは正常、1 行が影響を受けました (0.02 秒)

mysql> データベースを表示します。
+--------------------+
| データベース |
+--------------------+
| 情報スキーマ |
| テストデータベース |
|mysql |
| パフォーマンススキーマ |
|システム|
|テストデータベース|
+--------------------+

mysql> testdb を使用します。
データベースが変更されました
mysql> TestDb を使用します。
データベースが変更されました
mysql> TESTDB を使用します。
エラー 1049 (42000): 不明なデータベース 'TESTDB'

# テーブルを作成するmysql> CREATE TABLE if not exists `test_tb` (
    -> `increment_id` int(11) NOT NULL AUTO_INCREMENT COMMENT '自動増分主キー',
    -> `stu_id` int(11) NOT NULL COMMENT '学生番号',
    -> `stu_name` varchar(20) DEFAULT NULL COMMENT '学生名',
    -> 主キー (`increment_id`)、
    -> BTREE を使用したユニーク キー `uk_stu_id` (`stu_id`)
    -> ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='test_tb';
クエリは正常、影響を受けた行は 0 行 (0.06 秒)
mysql> `Student_Info`が存在しない場合はテーブルを作成します(
    -> `increment_id` int(11) NOT NULL AUTO_INCREMENT COMMENT '自動増分主キー',
    -> `Stu_id` int(11) NOT NULL COMMENT '学生ID',
    -> `Stu_name` varchar(20) DEFAULT NULL COMMENT '生徒名',
    -> 主キー (`increment_id`)、
    -> BTREE を使用したユニーク キー `uk_stu_id` (`Stu_id`)
    -> ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='Student_Info';
クエリは正常、影響を受けた行は 0 行 (0.06 秒)
mysql> テーブルを表示します。
+------------------+
| テストデータベース内のテーブル |
+------------------+
| 学生情報 |
| テスト_tb |
+------------------+

# クエリテーブルmysql> select Stu_id,Stu_name from test_tb limit 1;
+--------+-----------+
| スタウトID | スタウト名 |
+--------+-----------+
| 1001 | 1 から |
+--------+-----------+
セット内の 1 行 (0.00 秒)
mysql> test_tb から stu_id、stu_name を選択し、制限 1 を設定します。
+--------+-----------+
| スタッフID | スタッフ名 |
+--------+-----------+
| 1001 | 1 から |
+--------+-----------+

mysql> Test_tb から stu_id、stu_name を選択します。
エラー 1146 (42S02): テーブル 'testdb.Test_tb' が存在しません
mysql> test_tb から Stu_id、Stu_name を A として選択します。ここで、A.Stu_id = 1001;
 +--------+-----------+
| スタウトID | スタウト名 |
+--------+-----------+
| 1001 | 1 から |
+--------+-----------+
セット内の 1 行 (0.00 秒)
mysql> test_tb から Stu_id、Stu_name を A として選択します。ここで、a.Stu_id = 1001;
エラー 1054 (42S22): 'where 句' に不明な列 'a.Stu_id' があります

# ディスク上のディレクトリとファイルを表示します [root@localhost ~]#:/var/lib/mysql# ls -lh
合計 616M
drwxr-x--- 2 mysql mysql 20 6月 3 14:25 TestDb
...
drwxr-x--- 2 mysql mysql 144 6月3日 14:40 testdb
[root@localhost ~]#:/var/lib/mysql# cd testdb/
[root@localhost ~]#:/var/lib/mysql/testdb# ls -lh
合計 376K
-rw-r----- 1 mysql mysql 8.6K 6月3日 14:33 Student_Info.frm
-rw-r----- 1 mysql mysql 112K 6月3日 14:33 Student_Info.ibd
-rw-r----- 1 mysql mysql 8.6K 6月3日 14:40 TEST_TB.frm
-rw-r----- 1 mysql mysql 112K 6月3日 14:40 TEST_TB.ibd
-rw-r----- 1 mysql mysql 67 6月3日 14:25 db.opt
-rw-r----- 1 mysql mysql 8.6K 6月3日 14:30 test_tb.frm
-rw-r----- 1 mysql mysql 112K 6月3日 14:30 test_tb.ibd

上記の実験を通じて、lower_case_table_namesパラメータを0に設定すると、MySQLライブラリのテーブル名は大文字と小文字が厳密に区別され、テーブルエイリアスも大文字と小文字が区別されますが、列名は大文字と小文字が区別されないことがわかりました。クエリを実行するときにも、大文字と小文字を厳密に区別して記述する必要があります。同時に、同じ名前で大文字と小文字が異なるライブラリ名とテーブル名を作成することが許可されていることに気付きました (たとえば、TestDb ライブラリと testdb ライブラリは共存できます)。

lower_case_table_names が 0 に設定されている場合に発生する可能性のある問題について考えたことはありますか? たとえば、ある同僚が Test テーブルを作成し、別の同僚がプログラムの作成時にそれを test テーブルとして呼び出すと、テーブルが存在しないというエラー メッセージが表示されます。さらに悪いことに、TestDb ライブラリと testdb ライブラリが共存し、Test テーブルと test テーブルが共存する可能性があり、さらに混乱を招きます。したがって、移植性と使いやすさを最大限に高めるために、常に小文字の名前を使用してライブラリ テーブルを作成および参照するなど、一貫した規則を採用できます。この問題を解決するには、lower_case_table_names を 1 に設定することもできます。このパラメータが 1 の場合に何が起こるかを見てみましょう。

# 上記のテスト ライブラリを削除し、lower_case_table_names を 1 に変更してデータベースを再起動します。mysql> show variables like 'lower_case_table_names';
+------------------------+-------+
| 変数名 | 値 |
+------------------------+-------+
| 小文字のテーブル名 | 1 |
+------------------------+-------+

# データベースを作成します。mysql> create database TestDb;
クエリは正常、1 行が影響を受けました (0.02 秒)

mysql> データベース testdb を作成します。
エラー 1007 (HY000): データベース 'testdb' を作成できません。データベースが存在します
mysql> データベースを表示します。
+--------------------+
| データベース |
+--------------------+
| 情報スキーマ |
|mysql |
| パフォーマンススキーマ |
|システム|
|テストデータベース|
+--------------------+
セット内の行数は 7 です (0.00 秒)

mysql> testdb を使用します。
データベースが変更されました
mysql> TESTDB を使用します。
データベースが変更されました

# テーブルを作成するmysql> CREATE TABLE if not exists `test_tb` (
    -> `increment_id` int(11) NOT NULL AUTO_INCREMENT COMMENT '自動増分主キー',
    -> `stu_id` int(11) NOT NULL COMMENT '学生番号',
    -> `stu_name` varchar(20) DEFAULT NULL COMMENT '学生名',
    -> 主キー (`increment_id`)、
    -> BTREE を使用したユニーク キー `uk_stu_id` (`stu_id`)
    -> ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='test_tb';
クエリは正常、影響を受けた行は 0 行 (0.05 秒)
mysql> テーブル TEST_TB (id int) を作成します。
エラー 1050 (42S01): テーブル 'test_tb' は既に存在します

mysql> テーブルを表示します。
+------------------+
| テストデータベース内のテーブル |
+------------------+
| テスト_tb |
+------------------+

# クエリテーブルmysql> select stu_id,stu_name from test_tb limit 1;
+--------+-----------+
| スタッフID | スタッフ名 |
+--------+-----------+
| 1001 | 1 から |
+--------+-----------+
セット内の 1 行 (0.00 秒)

mysql> Test_Tb 制限 1 から stu_id、stu_name を選択します。
       +--------+-----------+
| スタッフID | スタッフ名 |
+--------+-----------+
| 1001 | 1 から |
+--------+-----------+
セット内の 1 行 (0.00 秒)

mysql> test_tb から stu_id、stu_name を A として選択します。ここで、a.stu_id = 1002;
+--------+-----------+
| スタッフID | スタッフ名 |
+--------+-----------+
| 1002 | dfsfd |
+--------+-----------+
セット内の 1 行 (0.00 秒)

lower_case_table_names パラメータを 1 に設定すると、データベース テーブル名が小文字で均一に格納され、クエリは大文字と小文字を区別せず、大文字と小文字を使用して検索できることがわかります。こうすると使いやすくなります。プログラムは、テーブル名が大文字か小文字かに関係なく、このテーブルを検索できます。また、異なるシステム間でデータベースを移行する場合も便利です。このため、lower_case_table_names パラメータを 1 に設定することをお勧めします。

2. パラメータ変更に関する注意事項

lower_case_table_names パラメータはグローバル システム変数であり、動的に変更することはできません。変更する場合は、構成ファイルに書き込み、データベースを再起動して有効にする必要があります。データベースのパラメータが最初に 0 に設定されていて、それを 1 に変更する場合は、元のインスタンスに大文字のライブラリとテーブルがある場合、それを 1 に変更した後の再起動後にこれらのライブラリとテーブルにアクセスできなくなるため、特に注意する必要があります。 lower_case_table_names パラメータを 0 から 1 に変更する必要がある場合は、次のように変更できます。

まず、インスタンスに大文字のライブラリとテーブルがあるかどうかを確認します。ない場合は、構成ファイルを直接変更して再起動できます。大文字のライブラリ テーブルがある場合は、構成ファイルを変更して再起動する前に、それらを小文字に変換する必要があります。

インスタンス内に大文字のデータベース テーブルがある場合は、次の 2 つの方法を使用して小文字に変更できます。

1. mysqldump を使用して関連データベースをバックアップし、バックアップが完了したら対応するデータベースを削除し、構成ファイルを変更して再起動し、最後にバックアップファイルを再インポートします。この方法は時間がかかるため、あまり使用されません。

2. rename ステートメントを使用して変更します。詳細については、次の SQL を参照してください。

# 大文字のテーブルの名前を小文字のテーブルに変更します
 テーブル TEST の名前を test に変更します。

# 大文字のデータベースが存在する場合は、まず小文字のデータベースを作成し、大文字のデータベース内のテーブルを小文字のデータベースに転送する必要があります。テーブル TESTDB.test_tb の名前を testdb.test_tb に変更します。

# 使用できる2つのSQL文を共有する
# 例のSELECTで大文字のテーブルをクエリする
 テーブルスキーマ、
 テーブル名
から
 情報スキーマ.`TABLES`
 どこ
 TABLE_SCHEMA が ( 'information_schema'、 'sys'、 'mysql'、 'performance_schema' ) に含まれていません
  かつ、table_type = 'ベーステーブル'
  AND TABLE_NAME 正規表現バイナリ '[AZ]'


   # 大文字データベースのテーブルを小文字データベースに転送するSQLを結合するSELECT
 CONCAT( 'テーブル TESTDB.', TABLE_NAME, ' を testdb.', TABLE_NAME, ';' に変更します)
 から
 情報スキーマ.TABLES
 どこ
 TABLE_SCHEMA = 'TESTDB';

要約:

この記事では、主に MySQL データベース テーブルの大文字と小文字の問題について説明します。この記事を読めば、データベース テーブル名に小文字の英語を使用することが推奨される理由が理解できるはずです。 lower_case_table_names パラメータを変更する場合は、この記事も参照してください。

上記は、MySQLライブラリ名とテーブル名の大文字と小文字の選択の詳細です。MySQLライブラリ名とテーブル名の大文字と小文字の詳細については、123WORDPRESS.COMの他の関連記事に注目してください。

以下もご興味があるかもしれません:
  • MySQL の大文字と小文字の区別に関する注意
  • MySQLの文字タイプは大文字と小文字を区別します
  • MySQL で大文字と小文字を区別しないように設定する方法
  • MySQLの大文字と小文字の区別によって発生する問題の分析
  • MySQLクエリで大文字と小文字を区別しない問題を解決する方法
  • MySQL データベースの大文字と小文字の区別の問題
  • MySQLテーブル名の大文字と小文字を区別しない設定方法の詳細な説明
  • Linux システム MySQL のパスワードを忘れた場合、パスワードをリセットし、テーブル名と列名の大文字と小文字を無視します
  • MySQL クエリ時に文字列の大文字と小文字を区別する方法
  • MySql クエリの大文字と小文字を区別しないソリューション (2)

<<:  HTML の著作権記号のフォント選択問題 (著作権記号をより美しくする方法)

>>:  ウェブページのテキストデザインは、服を着た賢い女の子のようであるべきだ

推薦する

HTML相対パスの親ディレクトリと子ディレクトリの書き方

親ディレクトリを指定する方法../ はソース ファイルの親ディレクトリを表し、../../ はソース...

vxe-table を使用して vue で編集可能なテーブルを作成するプロセス

プロジェクトには、オンラインで編集する必要があるテーブルがあります。最初は、要素の el-table...

Server-U 14バージョンのインストールと使用方法

Server-Uソフトウェアの紹介Server-U は非常に強力なファイル マネージャーです。FTP...

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

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

React 関数コンポーネントのパフォーマンス最適化のアイデアの詳細な説明

最適化のアイデア最適化には主に 2 つの方向があります。再レンダリングの回数を減らします。 Reac...

ミニプログラムカスタムタブバーコンポーネントのカプセル化

この記事の例では、ミニプログラムのカスタムタブバーコンポーネントをカプセル化するための具体的なコード...

mysql5.7.18.zip インストール不要版設定チュートリアル(Windows)

これは私が以前使用した mysql5.7.18.zip のインストール チュートリアルです。まずこれ...

ファイルの種類を検出するJavaScriptメソッド

目次1. 画像のバイナリデータを表示する方法2. 絵の種類の見分け方3. 画像の種類を検出する方法3...

Vue の foreach 配列と js の traversal 配列の書き方の説明

Vue foreach配列を記述し、jsで配列をトラバースする方法シナリオVueでAxiosを使用し...

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

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

Zabbix を使用して Nginx/Tomcat/MySQL を監視する方法の詳細なチュートリアル

目次ZabbixはNginxを監視するZabbixはTomcatを監視するZabbixはMySQLを...

Dockerのオンラインおよびオフラインインストールと一般的なコマンド操作

1. テスト環境名前バージョンセント7.6ドッカー18.09.06 2. オンラインインストールここ...

CSS マスクを使用して PNG 画像のサイズを大幅に最適化します (推奨)

この記事は共有および集約することを歓迎します。全文を転載する必要はありません。著作権を尊重してくださ...

Vue 3 カスタムディレクティブ開発の概要

指令とは何ですか? Angular と Vue はどちらもディレクティブの概念を持っており、これは通...

Ubuntu の仮想環境に Django をインストールする方法

Ubuntu コマンドライン ウィンドウで次の操作を実行します。 1. 仮想環境をインストールする...