正在尝试将一些 mysql 服务器迁移到新 AWS (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 -V
,是mysqld Ver 15.1 Distrib 5.5.64-MariaDB, for Linux (x86_64)
安装 yum install mariadb-server
我已验证架构的列是否与相关表匹配。
访问应用程序使用请求列为小写的 select 语句来查询表。 (我已连接本地应用程序并测试对两个数据库执行相同的查询)
例如SELECT column1,column2,column3,etc from TABLE1 where ..
原始数据库的查询结果遵循应用程序“select”语句中的大小写,但是在新的 mariadb 数据库中,查询结果与表中定义的列大小写匹配。
是否可以应用一个设置,使结果列名称遵循“SELECT”语句中的大小写,从而使两个数据库中的同一 select 语句返回的结果列名称匹配?
MariaDB和Mysql下的测试用例
select cname from (select s.CName from (select 'A' as CNAME) s) t;
在 MariaDB 下,结果集列大小写与中间临时表中的列匹配。
使用源 mysql 数据库进行相同的查询,
结果集列名的大小写与 select 语句中的大小写匹配
最佳答案
不使用 SQL 编码风格以及混合小写、大写或混合大小写标识符始终是一种不好的做法(“很难编写,因此应该很难阅读”)。有几种编码风格指南,例如SQL Style Guide .
除此之外,您还应该考虑升级到更新版本的 MariaDB/MySQL。 MariaDB 5.5 将在 3 个月内淘汰。
回到你的问题:
列标识符不区分大小写,因此优化器认为您的 SQL 语句可以简化,在最新版本的 MariaDB 中,EXPLAIN EXTENDED
和 SHOW WARNINGS
命令将给出您的更多信息:
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 中,您将得到相同的结果:
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 |
+-------+------+------------------------------------------------+
关于QA 迁移到 Maria DB 后的 MYSQL,应用程序查询返回列结果集元数据的不同情况,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59472191/