MySQL查看列名大小写

mma*_*one 7 php mysql linux symlink view

我正在将我们的内部应用程序从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)
Run Code Online (Sandbox Code Playgroud)

请注意,无论是否从表或视图中进行选择,SELECT查询中返回的列名的大小写都是不同的.该表返回运行时查询中指定的大小写; 视图创建时视图返回大小写.这似乎是通过MySQL的两个版本,包括命令行客户端和PHP库客户端都是一致的.

我发现的一个技巧是,如果在视图中向SELECT添加GROUP BY,它将在运行时使用查询中的大小写.不幸的是,我通过视图打破了更新,这是我需要的.

是否有任何方法可以使列名称大写与运行时的查询匹配,这不涉及返回并更改我们的所有应用程序代码?

Vik*_*tor 0

我不得不说我不是 100% 确定,但我强烈怀疑如果不修改应用程序代码,您就无法在视图中获得匹配的案例。看看视图是如何定义的(我使用的是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)
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,MySQL 添加了一个列别名 ( AS),并且据我所知,没有办法让它的行为有所不同。显式定义列名具有相同的结果:

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)
Run Code Online (Sandbox Code Playgroud)

在所有 SQL 查询中添加一个(看起来有点滑稽的)列别名显然可以解决这个问题:

mysql> select a as a from v;
+------+
| a    |
+------+
|   47 |
+------+
1 row in set (0.00 sec)
Run Code Online (Sandbox Code Playgroud)