查询视图时,列名称会更改大小写

时间:2012-01-09 16:22:08

标签: mysql

以下测试用例描述了我的问题。

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行为的参考,但有没有办法解决它?

3 个答案:

答案 0 :(得分:1)

除非引用列名或表名,否则SQL应该不区分大小写。不要在列和表名称周围加上引号,否则应该有问题。我注意到一些工具倾向于引用列和变量名称。

答案 1 :(得分: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 from view也会将列返回为“id”和“title”。

我不熟悉MySQL内部,但我希望它有意义。

答案 2 :(得分:1)

如果我们查询视图的存储方式:

SHOW CREATE VIEW the_view

...我们找到一个包含此内容的结果:

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`

如果用列表替换*,也会发生这种情况:MySQL添加了一个带有别名的AS子句,它有效地对列名进行硬编码。

结论是视图不是表格。您需要使用您想要使用的确切案例创建它。无论如何,情况通常都是无关紧要的,除非你的客户语言在案例发生变化时搞砸了(例如PHP关联数组)。