MySQL查看列名大小写

时间:2011-07-19 15:57:36

标签: php mysql linux view symlink

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

有没有办法让列名大小写在运行时匹配查询,这不涉及返回并更改我们的所有应用程序代码?

2 个答案:

答案 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)