1. 大文字と小文字の区別を決定するパラメータMySQL では、データベースはデータ ディレクトリ内のディレクトリに対応します。データベース内の各テーブルは、データベース ディレクトリ内の少なくとも 1 つのファイル (ストレージ エンジンによっては複数のファイル) に対応します。したがって、オペレーティング システムの大文字と小文字の区別によって、データベースが大文字と小文字を区別するかどうかが決まります。Windows システムでは大文字と小文字は区別されませんが、Linux システムでは大文字と小文字が区別されます。 デフォルトでは、ライブラリ テーブル名は Windows システムでは大文字と小文字が区別されませんが、Linux システムでは大文字と小文字が区別されます。列名、インデックス名、ストアド プロシージャ、関数、およびイベント名は、どのオペレーティング システムでも大文字と小文字が区別されません。また、列の別名も大文字と小文字が区別されません。 さらに、MySQL には lower_case_table_names システム変数も用意されており、これはテーブル名とデータベース名がディスク上に保存される方法と、MySQL でどのように使用されるかに影響します。Linux システムではこのパラメータのデフォルト値は 0 に設定され、Windows システムではデフォルト値は 1 に設定され、macOS システムではデフォルト値は 2 に設定されています。それぞれの値の具体的な意味を見てみましょう。
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の他の関連記事に注目してください。 以下もご興味があるかもしれません:
|
<<: HTML の著作権記号のフォント選択問題 (著作権記号をより美しくする方法)
>>: ウェブページのテキストデザインは、服を着た賢い女の子のようであるべきだ
タブ選択カードは、実際の Web ページで非常に頻繁に使用されます。基本的に、すべての Web ペー...
目次オブザーバーパターンとは何ですか?シナリオシミュレーションコードの実装コードのリファクタリング要...
目次1. ステートメントを挿入する1.1 行を挿入する1.2 複数行を挿入する1.3 クエリステート...
mysql 5.6.35 winx64無料インストールバージョン構成チュートリアルwin10、具体的...
この記事では、MySQL の null (IFNULL、COALESCE、NULLIF) に関連する...
問題を見つける今日、Docker コンテナ内のファイルを変更しようとしたところ、コンテナ内に vim...
この記事では、MySQL 8.0.20のインストールと設定方法についての詳細なチュートリアルを参考ま...
Nginx では、URL のパス パラメータに基づいて、到達不可能なアップストリームに動的に転送する...
1 hupからイメージを取得する docker プル nginx 2 マウントするディレクトリを作成...
序文PIPE、パイプラインと翻訳されます。 Angular パイプは、HTML コンポーネントで宣言...
目次1. はじめに1.1 原則1.2 プロセス1.3 特徴1.4 githubアドレス2. テスト環...
最近の問題としては、次のような現象があります。システムには、docker run コマンドを継続的に...
目次Vueのリスナーとは何かリスナーの使い方vue リスナーウォッチVue リスナー - ディープリ...
目次fileReader に関する落とし穴iOS における FileReader の落とし穴 (イメ...
1: dockerにmongodbをインストールするステップ1: dockerにmongodbをイン...