Разное поведение с MySQL 5.7 и 8.0

#mysql

#mysql

Вопрос:

Я пытаюсь использовать MySQL 8.0, но у меня возникают некоторые проблемы. Я установил MySQL 5.7 и 8.0, и у меня другое поведение со столбцами символов.

Для MySQL 5.7:

 mysql> create table test (id integer, c5 char(5));
Query OK, 0 rows affected (0.00 sec)

mysql> insert into test values(0, 'a');
Query OK, 1 row affected (0.00 sec)

mysql> select * from test where c5 = 'a    ';
 ------ ------ 
| id   | c5   |
 ------ ------ 
|    0 | a    |
 ------ ------ 
1 row in set (0.00 sec)

mysql>
  

Для MySQL 8.0:

 mysql> create table test (id integer, c5 char(5));
Query OK, 0 rows affected (0.01 sec)

mysql> insert into test values(0, 'a');
Query OK, 1 row affected (0.01 sec)

mysql> select * from test where c5 = 'a    ';
Empty set (0.00 sec)

mysql>
  

Оба сервера имеют одинаковую конфигурацию.

MySQL 5.7:

 [mysqld]
port=3357
datadir=/opt/mysql_57/data
sql_mode="STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION"
default_storage_engine=innodb
character-set_server=utf8mb4
socket=/opt/mysql_57/mysql57.sock
max_allowed_packet=4194304
server_id=1
lower_case_table_names=0
  

MySQL 8.0:

 [mysqld]
port=3380
datadir=/opt/mysql_80/data
sql_mode="STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION"
default_storage_engine=innodb
character-set_server=utf8mb4
socket=/opt/mysql_80/mysql80.sock
max_allowed_packet=4194304
server_id=1
lower_case_table_names=0
  

Краткий обзор списка изменений MySQL 8.0 не дал мне никакой информации. Где описаны изменения в этом поведении?

С наилучшими пожеланиями.

Ответ №1:

То, как MySQL обрабатывал конечные пробелы, зависит от используемой сортировки. Смотрите https://dev.mysql.com/doc/refman/8.0/en/charset-binary-collations.html подробнее.

Что изменилось между 5.7 и 8.0, так это то, что набор символов по умолчанию теперь равен UTF8mb4 с параметрами сортировки NOPAD.

Если вы хотите другое поведение, вам следует изменить набор символов / параметры сортировки для вашего столбца / таблицы / базы данных. Проверьте параметры сортировки таблицы INFORMATION_SCHEMA на наличие доступных параметров сортировки PAD. (Одно предупреждение: более старые параметры сортировки ПРОСТРАНСТВА PAD могут быть менее эффективными. Была проделана значительная работа по повышению производительности новых параметров сортировки в Юникоде на основе UCA 9.0.0.)

Ответ №2:

Смотрите PAD_CHAR_TO_FULL_LENGTH в документации MySQL

Комментарии:

1. Спасибо за ответ. Я видел эту информацию. Этот режим не включается в обоих случаях. Включены только STRICT_TRANS_TABLES и NO_ENGINE_SUBSTITUTION.