首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MYSQL在QA迁移到Maria DB之后,应用程序查询为列结果集元数据返回不同的大小写

MYSQL在QA迁移到Maria DB之后,应用程序查询为列结果集元数据返回不同的大小写
EN

Stack Overflow用户
提问于 2019-12-25 02:10:19
回答 1查看 64关注 0票数 0

我们试图将一些mysql服务器迁移到一个新的亚马逊网络服务(amazon-linux-2)实例上的MariaDB。在创建新实例并安装mariadb之后,我们通过mysqldump ... --add-drop-database --triggers --routines --events转储旧数据库,并使用mysql -u root < dump.sql将其导入到新系统中

数据库有一个由大小写混合列定义的表,例如COLUMN1,COLUMN2,column3,etc

通过mysqld -V,原始数据库是mysqld Ver 14.14 Distrib 5.5.62, for Linux (x86_64)

新数据库通过mysqld -Vyum install mariadb-server一起安装在mysqld Ver 15.1 Distrib 5.5.64-MariaDB, for Linux (x86_64)

我已经验证了该表的模式列是否匹配。

访问应用程序使用select语句查询表,该语句请求列为小写。(我已经连接了一个本地应用程序,并测试了对两个数据库执行相同的查询)

例如SELECT column1,column2,column3,etc from TABLE1 where ..

来自原始数据库的查询结果与来自应用程序的"select“语句中的大小写有关,但是在新的mariadb数据库中,查询结果与表中定义的列大小写匹配。

是否存在可以应用的设置,使结果列名遵循" select“语句中的大小写,从而使两个数据库中相同的select语句返回的结果列名匹配?

MariaDB和Mysql环境下的一个测试用例

代码语言:javascript
复制
select cname from (select s.CName from (select 'A' as CNAME) s) t;

在MariaDB下,结果集列大小写与中间临时表中的列匹配。

利用使用源mysql数据库的相同查询,

结果集列名称的大小写与select语句中的大小写匹配

EN

回答 1

Stack Overflow用户

发布于 2019-12-26 15:44:22

不使用SQL的编码样式和混合使用小写、大写或混合大小写的标识符(“这很难写,因此它应该很难读”)总是一个糟糕的实践。有几种编码风格的指导原则,例如SQL Style Guide

除此之外,您还应该考虑升级到更新版本的MariaDB/MySQL。MariaDB 5.5将在3个月内发布。

但回到你的问题上:

列标识符不区分大小写,因此优化器识别出您的SQL语句可以简化,在较新版本的MariaDB中,EXPLAIN EXTENDEDSHOW WARNINGS命令将为您提供更多信息:

代码语言:javascript
复制
MariaDB [(none)]> select version();
+--------------------------+
| version()                |
+--------------------------+
| 10.5.1-MariaDB-debug-log |
+--------------------------+
MariaDB [(none)]> explain extended select cname from (select s.CName from (select 'A' as CNAME) s) t;
+------+-------------+------------+--------+---------------+------+---------+------+------+----------+----------------+
| id   | select_type | table      | type   | possible_keys | key  | key_len | ref  | rows | filtered | Extra          |
+------+-------------+------------+--------+---------------+------+---------+------+------+----------+----------------+
|    1 | PRIMARY     | <derived3> | system | NULL          | NULL | NULL    | NULL | 1    |   100.00 |                |
|    3 | DERIVED     | NULL       | NULL   | NULL          | NULL | NULL    | NULL | NULL |     NULL | No tables used |
+------+-------------+------------+--------+---------------+------+---------+------+------+----------+----------------+
2 rows in set, 1 warning (0.00 sec)

MariaDB [(none)]> show warnings;
+-------+------+------------------------------------------------+
| Level | Code | Message                                        |
+-------+------+------------------------------------------------+
| Note  | 1003 | /* select#1 */ select 'A' AS `CName` from dual |
+-------+------+------------------------------------------------+ 

如您所见,该语句经过优化并转换为select 'A' AS `CName` from dual

显然,在MariaDB 5.5中,优化器已经比MySQL优化器更现代了,但在最近的MySQL版本中,你会得到同样的结果:

代码语言:javascript
复制
mysql> select version();
+-----------+
| version() |
+-----------+
| 8.0.13    |
+-----------+
1 row in set (0,00 sec)

mysql> explain select cname from (select s.CName from (select 'A' as CNAME) s) t;
+----+-------------+------------+------------+--------+---------------+------+---------+------+------+----------+----------------+
| id | select_type | table      | partitions | type   | possible_keys | key  | key_len | ref  | rows | filtered | Extra          |
+----+-------------+------------+------------+--------+---------------+------+---------+------+------+----------+----------------+
|  1 | PRIMARY     | <derived3> | NULL       | system | NULL          | NULL | NULL    | NULL |    1 |   100.00 | NULL           |
|  3 | DERIVED     | NULL       | NULL       | NULL   | NULL          | NULL | NULL    | NULL | NULL |     NULL | No tables used |
+----+-------------+------------+------------+--------+---------------+------+---------+------+------+----------+----------------+
2 rows in set, 1 warning (0,00 sec)

mysql> show warnings;
+-------+------+------------------------------------------------+
| Level | Code | Message                                        |
+-------+------+------------------------------------------------+
| Note  | 1003 | /* select#1 */ select 'A' AS `CName` from dual |
+-------+------+------------------------------------------------+
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59472191

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档