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 の基礎: HTML コンテンツの詳細

まずは本体から始めましょう:ウェブページを閲覧するとき、最初に目に留まるのは通常、ページの背景です。...

ブラウザのCSS、JavaScript、背景画像のキャッシュをクリアする簡単な方法

実際のプロジェクト開発プロセスでは、ページがサーバーにアップロードされます。サーバーへの負荷を軽減し...

画像内のrarファイルを隠す方法

このロゴを .rar ファイルとしてローカルに保存し、解凍して効果を確認することができます。よりシン...

Reactフック入門チュートリアル

ステートフック例: 'react' から useState をインポートします。 関...

MySQL スライディング集計/年初来集計の原理と使用例の分析

この記事では、例を使用して、MySQL スライディング集計/年初来集計の原理と使用方法を説明します。...

MySQL データベース接続例外の概要 (収集する価値あり)

Centos にプロジェクトをデプロイするときに奇妙な問題が見つかりました。データベース接続で例外...

iframe タグの使用方法の詳細な説明 (属性、透明度、適応高さ)

1. iframe の定義と使用法iframe 要素は、別のドキュメントを含むインライン フレーム...

MySQLを5.7にアップグレードすると、WordPressはデータをインポートするときにエラー1067を報告します

最近MySQLを5.7にアップグレードしましたが、WordPressでデータのインポート時にエラーが...

MySQL マスター スレーブ データベースが同期されない問題を解決する 2 つの方法

目次MySQL マスター スレーブ データベースが同期されない問題を解決する 2 つの方法1. 非同...

WeChatアプレットはキャンバスを使用して時計を描画します

この記事では、キャンバスを使用してWeChatアプレットに時計を描く具体的なコードを参考までに共有し...

Vueルーティング相対パスジャンプメソッド

目次Vueルーティング相対パスジャンプ1. 属性の追加2.router.resolveメソッドVue...

VC6.0をWIN10にインストールすると使用できない問題の解決方法

VC6.0は確かに古すぎるVC6.0は昔の開発ツールです。現在のwin10では対応していません。しか...

MySQL マルチテーブルクエリの具体例

1. SELECT句を使用して複数のテーブルをクエリするSELECT フィールド名 FROM tab...

ボックスモデルのサイズの詳細な説明は、パディング、マージン、境界の値によって異なります。

ボックス モデルは、要素ボックスの幅と高さ、パディング、境界線、余白のサイズを指定します。境界線の内...

MySQLは文字列関数のSQL文をインターセプトします

1. left(name,4)は左の4文字をインターセプトしますリスト: SELECT LEFT(2...