我正在将内部应用程序从MySQL 5.0.45升级到5.1.41。在旧环境中,我们使用从一个DB到另一个DB的符号链接镜像了一些表。由于一些原因,当前版本的MySQL完全阻止了。
看起来最好的替代品是使用视图,但我遇到了问题。一些旧表的列名大写。但是,我们的一些应用程序代码(PHP)使用大写名称执行SELECT,并使用小写列名称执行一些SELECT。这通常可以正常工作,因为MySQL在SELECT中引用它时返回列名大写的表。但是,有一种观点似乎并非如此。请参阅以下内容:
create table t(A int);
Query OK, 0 rows affected (0.18 sec)
> create view v as select A from t;
Query OK, 0 rows affected (0.00 sec)
> insert into t values(47);
Query OK, 1 row affected (0.01 sec)
> select a from t;
+------+
| a |
+------+
| 47 |
+------+
1 row in set (0.00 sec)
> select a from v;
+------+
| A |
+------+
| 47 |
+------+
1 row in set (0.00 sec)
请注意,无论是否从表或视图中进行选择,SELECT查询中返回的列名的大小写都是不同的。该表返回运行时查询中指定的大小写;视图创建时视图返回大小写。这两个版本的MySQL似乎都是一致的,包括命令行客户端和PHP库客户端。
我发现的一个技巧是,如果在视图中向SELECT添加GROUP BY,它将在运行时使用查询中的大小写。不幸的是,这会破坏我需要的视图更新。
有没有办法让列名大小写在运行时匹配查询,这不涉及返回并更改我们的所有应用程序代码?
答案 0 :(得分:0)
我不得不说我不是百分百肯定,但我强烈怀疑在不修改应用程序代码的情况下,您无法在视图中获得匹配的大小写。看看如何定义视图(我正在使用MySQL 5.1.56):
mysql> show create view v;
+------+-----------------------------------------------------------------------------------------------------------------------+----------------------+----------------------+
| View | Create View | character_set_client | collation_connection |
+------+-----------------------------------------------------------------------------------------------------------------------+----------------------+----------------------+
| v | CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `v` AS select `t`.`A` AS `A` from `t` | utf8 | utf8_general_ci |
+------+-----------------------------------------------------------------------------------------------------------------------+----------------------+----------------------+
1 row in set (0.00 sec)
正如您所看到的,MySQL添加了一个列别名(AS
),而AFAIK则无法使其行为不同。显式定义列名称具有相同的结果:
mysql> create view v2 (viewa) as select A from t;
Query OK, 0 rows affected (0.02 sec)
mysql> select Viewa from v2;
+-------+
| viewa |
+-------+
| 47 |
+-------+
1 row in set (0.00 sec)
mysql> show create view v2;
+------+----------------------------------------------------------------------------------------------------------------------------+----------------------+----------------------+
| View | Create View | character_set_client | collation_connection |
+------+----------------------------------------------------------------------------------------------------------------------------+----------------------+----------------------+
| v2 | CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `v2` AS select `t`.`A` AS `viewa` from `t` | utf8 | utf8_general_ci |
+------+----------------------------------------------------------------------------------------------------------------------------+----------------------+----------------------+
1 row in set (0.00 sec)
在所有SQL查询中添加(看起来很滑稽)列别名显然可以解决问题:
mysql> select a as a from v;
+------+
| a |
+------+
| 47 |
+------+
1 row in set (0.00 sec)
答案 1 :(得分:0)
代替,
mysql> select a from v;
使用此(带别名),
mysql> select a as a from v;
+------+
| a |
+------+
| 47 |
+------+
1 row in set (0.00 sec)