QA 迁移到 Maria DB 后的 MYSQL,应用程序查询返回列结果集元数据的不同情况

标签 mysql mariadb

正在尝试将一些 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 下,结果集列大小写与中间临时表中的列匹配。

Results column case follows Intermediary table column casing

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

MySQL Query Results columns match the case of the selection

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

最佳答案

不使用 SQL 编码风格以及混合小写、大写或混合大小写标识符始终是一种不好的做法(“很难编写,因此应该很难阅读”)。有几种编码风格指南,例如SQL Style Guide .

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

回到你的问题:

列标识符不区分大小写,因此优化器认为您的 SQL 语句可以简化,在最新版本的 MariaDB 中,EXPLAIN EXTENDEDSHOW 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/

相关文章:

mysql - 引导 Galera 集群失败

php - 按 id 对表元素的值进行分组

mysql - 从每个月获取所有值,如果该月没有数据则置零

php - 管理 PHP 和 MySQL 中事务边界中的不同类插入和更新

php - Cakephp搜索不存在的表条目的条件

mysql - MariaDB 错误?喜欢逃离 splinter

php - 如何根据 session 查询显示用户消息收件箱?

mysql - 有问题的 LAST_INSERT_ID

mysql - 如何在 XAMPP 中将 MariaDB 更改为 MySQL?

mysql - 当我使用 Waterline 的创建方法时,它不会返回新记录的 ID