以下测试用例描述了我的问题。
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 :(得分: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关联数组)。