微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

MySQL视图列名大小写

我正在将我们的内部应用程序从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,在SELECT查询中返回的列名的大小写都是不同的。 该表返回在运行时查询中指定的大小写; 该视图在创build视图时返回大小写。 这似乎是通过两个版本的MysqL,命令行客户端和通过PHP库客户端一致。

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

当通过符号链接访问文件时,如何让Django的manage.py正常工作?

403禁止在web根目录下的符号链接

符号链接的Linux命令文件

Windows上的Ant符号链接任务(NTFS)

python符号链接在Windows 10创build者更新

有什么办法使列名大写匹配查询在运行时,这不涉及回去和改变我们所有的应用程序代码

如何select性地创build符号链接到LINUX中另一个目录中的特定文件

在Python上使用Windows上的符号链接模块

忽略.gitignore中的符号链接

在Java中检测符号链接

git checkout – <filename>不会恢复Windows 10上本地删除的符号链接

我必须说我不是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)

正如你所看到的,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)

代替,

MysqL> select a from v;

使用这个(带别名),

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐