Назад | Перейти на главную страницу

После миграции с MYSQL на Maria DB запрос возвращает разные случаи для имен столбцов результирующих наборов.

Мы пытались перенести серверы mysql на MariaDB на новом экземпляре AWS (amazon-linux-2). После создания нового экземпляра и установки mariadb мы сбросили старую базу данных через mysqldump ... --add-drop-database --triggers --routines --events и импортированы в новую систему с помощью mysql -u ... < 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,

Оболочка имени столбца набора результатов совпадает с регистром в операторе выбора

(Спасибо за полный тестовый пример.)

Различные оптимизаторы:

mysql> explain
    -> 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 | Extra          |
+----+-------------+------------+--------+---------------+------+---------+------+------+----------------+
|  1 | PRIMARY     | <derived2> | system | NULL          | NULL | NULL    | NULL |    1 | NULL           |
|  2 | DERIVED     | <derived3> | system | NULL          | NULL | NULL    | NULL |    1 | NULL           |
|  3 | DERIVED     | NULL       | NULL   | NULL          | NULL | NULL    | NULL | NULL | No tables used |
+----+-------------+------------+--------+---------------+------+---------+------+------+----------------+
3 rows in set (0.01 sec)

mysql> select @@version;
+-----------------+
| @@version       |
+-----------------+
| 5.6.22-71.0-log |
+-----------------+

против

mysql> explain
    -> 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 | Extra          |
+------+-------------+------------+--------+---------------+------+---------+------+------+----------------+
|    1 | PRIMARY     | <derived3> | system | NULL          | NULL | NULL    | NULL |    1 |                |
|    3 | DERIVED     | NULL       | NULL   | NULL          | NULL | NULL    | NULL | NULL | No tables used |
+------+-------------+------------+--------+---------------+------+---------+------+------+----------------+
2 rows in set (0.00 sec)

mysql> select @@version;
+--------------------------------------+
| @@version                            |
+--------------------------------------+
| 10.4.1-MariaDB-1:10.4.1+maria~bionic |
+--------------------------------------+

Обратите внимание, как MariaDB была достаточно умен, чтобы отбросить один слой вашего запроса.

(Вопросы MySQL / MariaDB лучше решать на stackoverflow.com или dba.stackexchange.com.)

Но в какой-то момент Oracle все же догнал:

mysql> select cname from (select s.CName from (select 'A' as CNAME) s) t;
+-------+
| CName |
+-------+
| A     |
+-------+
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> select @@version;
+-----------+
| @@version |
+-----------+
| 8.0.17    |
+-----------+
1 row in set (0.00 sec)