MySQL视图列名大写


MySQL view column name capitalization

我正在将我们的内部应用程序从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,它将在运行时在查询中使用大写。不幸的是,这破坏了通过视图的更新,这是我需要的。

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

我不得不说我不是百分之百确定,但我强烈怀疑,如果不修改应用程序代码,就无法在视图中获得匹配的case。看看视图是如何定义的(我使用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),而且我敢肯定,没有办法使它的行为不同。显式定义列名具有相同的结果:

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)

代替,

    mysql> select a from v;

使用this(带别名),

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

必须像这样使用Mysql列别名: