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 の著作権記号のフォント選択問題 (著作権記号をより美しくする方法)

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

推薦する

js でシンプルなタブを実装する

タブ選択カードは、実際の Web ページで非常に頻繁に使用されます。基本的に、すべての Web ペー...

Javascriptでオブザーバーモードを実装する方法を教えます

目次オブザーバーパターンとは何ですか?シナリオシミュレーションコードの実装コードのリファクタリング要...

MySQL学習データベース操作DML初心者向け詳細解説

目次1. ステートメントを挿入する1.1 行を挿入する1.2 複数行を挿入する1.3 クエリステート...

win10 mysql 5.6.35 winx64 無料インストールバージョン設定チュートリアル

mysql 5.6.35 winx64無料インストールバージョン構成チュートリアルwin10、具体的...

MySQL の null (IFNULL、COALESCE、NULLIF) に関する知識ポイントのまとめ

この記事では、MySQL の null (IFNULL、COALESCE、NULLIF) に関連する...

Dockerコンテナにvimコマンドがない問題を解決する方法

問題を見つける今日、Docker コンテナ内のファイルを変更しようとしたところ、コンテナ内に vim...

MySQL 8.0.20 のインストールと設定の詳細なチュートリアル

この記事では、MySQL 8.0.20のインストールと設定方法についての詳細なチュートリアルを参考ま...

NginxはURLのパスに応じてアップストリームに動的に転送します

Nginx では、URL のパス パラメータに基づいて、到達不可能なアップストリームに動的に転送する...

Dockerでnginxを実行し、ローカルディレクトリをイメージにマウントする方法

1 hupからイメージを取得する docker プル nginx 2 マウントするディレクトリを作成...

AngularパイプラインPIPEの紹介と使い方

序文PIPE、パイプラインと翻訳されます。 Angular パイプは、HTML コンポーネントで宣言...

MySQL オンライン DDL ツール gh-ost 原理分析

目次1. はじめに1.1 原則1.2 プロセス1.3 特徴1.4 githubアドレス2. テスト環...

Docker実行コンテナが作成状態にある問題についての簡単な説明

最近の問題としては、次のような現象があります。システムには、docker run コマンドを継続的に...

Vue の基本リスナーの詳細な説明

目次Vueのリスナーとは何かリスナーの使い方vue リスナーウォッチVue リスナー - ディープリ...

fileReader 使用時の落とし穴と解決策

目次fileReader に関する落とし穴iOS における FileReader の落とし穴 (イメ...

Docker mongoDB 4.2.1 をインストールし、Springboot ログを収集する詳細な手順

1: dockerにmongodbをインストールするステップ1: dockerにmongodbをイン...