Php MySQL视图列名大小写

Php MySQL视图列名大小写,php,mysql,linux,view,symlink,Php,Mysql,Linux,View,Symlink,我正在将我们的内部应用程序从MySQL 5.0.45升级到5.1.41。在旧环境中,我们使用符号链接将一些表从一个数据库镜像到另一个数据库。出于一些原因,MySQL的当前版本完全阻止了这一点 看起来最好的替代方法是使用视图,但我遇到了一个问题。一些旧表的列名是大写的。然而,我们的一些应用程序代码(PHP)使用大写名称进行选择,也有一些使用小写列名进行选择。这通常可以正常工作,因为MySQL返回的表的列名在SELECT中引用时大写。然而,从一个角度来看,情况似乎并非如此。见下文: create

我正在将我们的内部应用程序从MySQL 5.0.45升级到5.1.41。在旧环境中,我们使用符号链接将一些表从一个数据库镜像到另一个数据库。出于一些原因,MySQL的当前版本完全阻止了这一点

看起来最好的替代方法是使用视图,但我遇到了一个问题。一些旧表的列名是大写的。然而,我们的一些应用程序代码(PHP)使用大写名称进行选择,也有一些使用小写列名进行选择。这通常可以正常工作,因为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库客户端中都是一致的

我发现的一个技巧是,如果将GROUPBY添加到视图中的SELECT,它将在运行时在查询中使用大小写。不幸的是,这破坏了视图的更新,这是我需要的


是否有任何方法可以使列名大小写在运行时与查询匹配,而不需要返回并更改所有应用程序代码?

我不得不说,我不是100%确定,但我强烈怀疑,如果不修改应用程序代码,就无法在视图中获得匹配的大小写。看看视图是如何定义的(我使用的是MySQL 5.1.56):

正如您所看到的,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;
使用此选项(使用别名)


您可以尝试一些服务器设置:无论如何,我并不认为有什么问题。因为您使用的是它返回的数据,而不是表名。但是如果需要,为什么不使用类似于
的方法从v中选择一个作为字段的名称马克:不幸的是,这些都适用于数据库和表名,而不是列名。朱尔斯:问题是,程序希望收到的结果使用select中使用的大小写。如果视图的列名为field_name,您选择field_name,您的PHP代码查找field_name(区分大小写),它将找不到任何内容,因为结果将在field_name下返回。如果更改为不区分大小写的编码,这个问题可能会消失。是的,这与我得出的结论基本相同。最后,我回顾并扩展了DB模型,以允许我们将一个表包含到一组相同的表中,这些表在逻辑DBs之间镜像。然后,当数据写入一个表时,它也会写入组中的所有其他表。有点像binlog,只是它跨逻辑DBs,而不是物理服务器。不是我喜欢的解决方案,但它已经工作了一段时间,没有任何问题。
    mysql> select a from v;
    mysql> select a as a from v;
    +------+
    | a    |
    +------+
    |   47 |
    +------+
    1 row in set (0.00 sec)