2012-01-09 8 views
2

次のテストケースで問題が説明されています。ビューのクエリ時に列名が変更される

CREATE TABLE the_table (id INT, Title CHAR(10)); 
CREATE VIEW the_view AS SELECT * FROM the_table; 
INSERT INTO the_table VALUES (1, 'Hello'); 

今大文字

で 'タイトル' 私がしようとした旨の通知:

SELECT id, title FROM the_table; 

Result: 
+------+-------+ 
| id | title | 
+------+-------+ 
| 1 | Hello | 
+------+-------+ 

は( 'タイトル' がクエリと結果列の両方に小文字れている様子がわかり)

でも、同じことをビューで行うと、

SELECT id, title FROM the_view; 

Result: 
+------+-------+ 
| id | Title | 
+------+-------+ 
| 1 | Hello | 
+------+-------+ 

これは同じselect句ですが、今回は 'Title'の列名が大文字になりました!

私はまったく同じスキーマのビューでコードを再利用しようとしていますが、これはそれを混乱させます。

これは標準的なMySQLの動作であるかどうかにかかわらず、私は実際に参照を見つけることができませんが、その周りに道がありますか?

+0

これは、MySQLがどのように動作するかを示す回答があります。実際には、Standard SQLがどのようなSQL実装でも動作する必要があるので、MySQLの奇抜ではありません。大文字と小文字を区別する必要があると確信している場合は、(a)後継者があなたの決定を嫌うことを期待し、(b)名前を二重引用符(SQL標準)またはバッククォート(MySQL非標準表記 - MS SQL Serverの角括弧表記)を使用するたびに表示されます。 –

答えて

1

我々はビューが保存されている方法を問い合わせる場合:列リストで*を交換する場合、これは同様に起こる

CREATE ALGORITHM=UNDEFINED DEFINER=`test`@`%` SQL SECURITY DEFINER VIEW `the_view` AS select `the_table`.`id` AS `id`,`the_table`.`Title` AS `Title` from `the_table` 

SHOW CREATE VIEW the_view 

...私たちは、この格納されている結果を見つけます:MySQLはAS句をエイリアスとともに追加します。これは、カラム名を効果的にハードコードします。

結論として、ビューはテーブルではありません。あなたはあなたが使用したいと思う正確なケースでそれを作成する必要があります。大文字と小文字を変更したときにクライアントの言語が間違っていない限り(PHP連想配列など)、大文字小文字は関係ありません。

+0

私は本当に別の答えを求めていました。 – vassilis

1

カラム名またはテーブル名を引用符で囲まない限り、SQLでは大文字と小文字が区別されません。列名とテーブル名を引用符で囲まないでください。問題があるはずです。私はいくつかのツールが列名と変数名を引用する傾向にあることに気付きました。

1

これは標準的なMySQLの動作です。 MySQLは、メインクエリで使用する結果セットの列名を使用します。カラム名はMySQLでは大文字小文字を区別しないので、大文字小文字の大文字小文字を問わず、結果セットに同じ大文字小文字を使用することができます。

したがって、SELECT id, title FROM the_table;は結果セットに "id"と "title"を使用します。 SELECT ID, TITLE FROM the_table;またはSELECT Id, Title FROM the_table;を実行すると、それぞれの場合に列名が表示されます。

ビューでは、ビューを作成するときに使用されるSELECTステートメントで提供される列名が使用されます。あなたの場合、それはSELECT * FROM the_table;です。したがって、SELECT id, title FROM the_view;を実行すると、列名は「id」および「Title」となります。

ただし、小文字の列名を使用してCREATE VIEW the_view AS SELECT id, title FROM the_table;というビューを作成すると、SELECTからのビューでも列が「id」および「title」として返されます。

私はMySQLの内部についてはよく知られていませんが、意味があると思います。

関連する問題