MySQL 5.7和8.0的不同行为

时间:2019-04-08 12:06:19

标签: mysql

我正在尝试使用MySQL 8.0,但是遇到了一些问题。我已经安装了MySQL 5.7和8.0,并且在CHAR列上有不同的行为。

对于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>

两个服务器都具有相同的配置。

5.7的MySQL:

[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更改日志的简要概述没有提供任何信息。在哪里描述了这种行为的变化?

最诚挚的问候。

2 个答案:

答案 0 :(得分:2)

MySQL如何处理尾随空格,取决于所使用的排序规则。有关详情,请参见https://dev.mysql.com/doc/refman/8.0/en/charset-binary-collations.html

在5.7和8.0之间进行了更改,在于默认字符集现在为带有NOPAD归类的UTF8mb4。

如果您想要其他行为,则应更改列/表/数据库的字符集/排序规则。检查INFORMATION_SCHEMA表的COLLATIONS中是否有可用的PAD归类。 (一个警告:较旧的PAD SPACE排序规则可能效率较低。已经做了很多工作来提高基于UCA 9.0.0的新Unicode排序规则的性能。)

答案 1 :(得分:0)

请参阅MySQL文档中的PAD_CHAR_TO_FULL_LENGTH