Каковы изменения в случае набора строк результата MySQL 8? - PullRequest
0 голосов
/ 05 февраля 2019

при работе

SELECT maxlen FROM `information_schema`.`CHARACTER_SETS`;

mysql 5.7 и mysql 8 дают разные результаты:

  • в mysql 5.7 имена строк результатов в нижнем регистре,
  • вmysql 8 имена строк результатов пишутся в верхнем регистре.

Примечание: в таблице CHARACTER_SETS имя столбца равно MAXLEN (в верхнем регистре).

Поскольку я могу 'Я не могу найти ресурс, документирующий его:

Каковы изменения в случае набора строк результата mysql 8?

Ответы [ 2 ]

0 голосов
/ 05 февраля 2019

MySQL 8.0 изменил реализацию некоторых представлений в INFORMATION_SCHEMA:

https://mysqlserverteam.com/mysql-8-0-improvements-to-information_schema/ говорит:

Теперь, когда метаданные всех таблиц базы данных хранятся втаблицы словаря транзакционных данных, это позволяет нам проектировать таблицу INFORMATION_SCHEMA в качестве базы данных VIEW поверх таблиц словаря данных.Это исключает затраты, такие как создание временных таблиц для каждого запроса INFORMATION_SCHEMA во время выполнения на лету, а также сканирование каталогов файловой системы для поиска файлов FRM.Также теперь можно использовать все возможности оптимизатора MySQL для подготовки более эффективных планов выполнения запросов с использованием индексов таблиц словаря данных.

Так что это делается по веским причинам, но я понимаю, что оно имеетрасстраивать некоторые ваши запросы, когда вы выбираете результаты в ассоциативных массивах, основанных на имени столбца.

Вы можете увидеть, как определение представления явно объявляет имя столбца в верхнем регистре:

mysql 8.0.14> SHOW CREATE VIEW CHARACTER_SETS\G
*************************** 1. row ***************************
                View: CHARACTER_SETS
         Create View: CREATE ALGORITHM=UNDEFINED DEFINER=`mysql.infoschema`@`localhost` SQL SECURITY DEFINER VIEW `CHARACTER_SETS` AS 
  select 
    `cs`.`name` AS `CHARACTER_SET_NAME`,
    `col`.`name` AS `DEFAULT_COLLATE_NAME`,
    `cs`.`comment` AS `DESCRIPTION`,
    `cs`.`mb_max_length` AS `MAXLEN` -- delimited column explicitly uppercase
  from (`mysql`.`character_sets` `cs` 
  join `mysql`.`collations` `col` on((`cs`.`default_collation_id` = `col`.`id`)))

character_set_client: utf8
collation_connection: utf8_general_ci

Вы можетеОбойти изменение можно несколькими способами:

Вы можете объявить собственные псевдонимы столбцов в том случае, если вы хотите при запросе к представлению:

mysql 8.0.14> SELECT MAXLEN AS `maxlen` 
  FROM `information_schema`.`CHARACTER_SETS` LIMIT 2;
+--------+
| maxlen |
+--------+
|      2 |
|      1 |
+--------+

Вы можете начать привычку запрашиватьстолбцы в верхнем регистре до 8.0.Вот тест, показывающий результаты в моей песочнице 5.7:

mysql 5.7.24> SELECT MAXLEN 
  FROM `information_schema`.`CHARACTER_SETS` LIMIT 2;
+--------+
| MAXLEN |
+--------+
|      2 |
|      1 |
+--------+

Или вы можете получить результаты в неассоциативный массив и ссылаться на столбцы по номеру столбца, а не по имени.

0 голосов
/ 05 февраля 2019

Чувствительность к регистру не меняется.Если вы проверяете документацию mysql по чувствительности регистра к идентификатору, то и v5.7 и v8.0 говорят, что имена полей не чувствительны к регистру:

Столбец, индекс, имена хранимых подпрограмм, событий и групп ресурсов не чувствительны к регистру на любой платформе, а также псевдонимы столбцов.

Мне кажется, это больше похоже на разницу в отображении.

...