本节列出了最新版本的 MySQL 中的已知问题。
有关平台特定问题的信息,请参阅 第 2.1 节“一般安装指南”和 第 5.9 节“调试 MySQL”中的安装和调试说明。
已知以下问题:
- 的子查询优化 - IN不如 有效- =。
- 即使您使用 - lower_case_table_names=2(这使 MySQL 能够记住用于数据库和表名的大小写),MySQL 也不会记住用于函数- DATABASE()或各种日志(在不区分大小写的系统上)的数据库名称的大小写。
- 删除 - FOREIGN KEY约束在复制中不起作用,因为约束在副本上可能有另一个名称。
- DISTINCT如果您不使用列表中的所有列且仅使用列表中的那些列,则 with- ORDER BY在内部不起作用 。- GROUP_CONCAT()- DISTINCT
- 将大整数值(介于 2 63和 2 64 −1 之间)插入小数或字符串列时,它会作为负值插入,因为该数字是在有符号整数上下文中计算的。 
- 使用基于语句的二进制日志记录,源服务器将执行的查询写入二进制日志。这是一种非常快速、紧凑且高效的日志记录方法,在大多数情况下都能完美运行。但是,如果以数据修改不确定的方式设计查询(通常不推荐的做法,即使在复制之外),源和副本上的数据也可能变得不同。 - 例如: - CREATE TABLE ... SELECT或 将零或值插入 列的- INSERT ... SELECT语句 。- NULL- AUTO_INCREMENT
- DELETE如果要从具有带- ON DELETE CASCADE属性的外键的表中删除行。
- REPLACE ... SELECT,- INSERT IGNORE ... SELECT如果您在插入的数据中有重复的键值。
 - 当且仅当前面的查询没有 - ORDER BY保证确定性顺序的子句时。- 例如,对于 - INSERT ... SELECTno- ORDER BY,- SELECT可能会以不同的顺序返回行(这会导致行具有不同的等级,因此在- AUTO_INCREMENT列中获得不同的数字),具体取决于优化器对源和副本所做的选择。- 只有在以下情况下,查询才会在源和副本上进行不同的优化: - 该表在源上使用与副本上不同的存储引擎进行存储。(可以在源和副本上使用不同的存储引擎。例如,您可以 - InnoDB在源上使用,但- MyISAM如果副本的可用磁盘空间较少,则在副本上使用。)
- 源和副本上的MySQL 缓冲区大小( - key_buffer_size等)不同。
- 源和副本运行不同的 MySQL 版本,优化器代码在这些版本之间不同。 
 - 这个问题也可能影响使用 mysqlbinlog|mysql的数据库恢复。 - 避免此问题的最简单方法是 - ORDER BY在上述非确定性查询中添加一个子句,以确保行始终以相同的顺序存储或修改。使用基于行或混合的日志格式也可以避免这个问题。
- 如果您未使用启动选项指定文件名,则日志文件名基于服务器主机名。如果将主机名更改为其他名称,要保留相同的日志文件名,必须明确使用诸如 . 请参阅第 5.1.7 节,“服务器命令选项”。或者,重命名旧文件以反映您的主机名更改。如果这些是二进制日志,您必须编辑二进制日志索引文件并修复二进制日志文件名。(副本上的中继日志也是如此。) - --log-bin=- old_host_name-bin
- mysqlbinlog不会删除 - LOAD DATA语句后留下的临时文件。请参阅第 4.6.9 节,“mysqlbinlog — 处理二进制日志文件的实用程序”。
- RENAME不适- TEMPORARY用于表格或表格中使用的- MERGE表格。
- 使用 时 - SET CHARACTER SET,您不能在数据库、表和列名称中使用翻译后的字符。
- 在 MySQL 8.0.17 之前,您不能使用 - _or- %with- ESCAPEin- LIKE ... ESCAPE。
- 服务器 - max_sort_length在比较数据值时仅使用第一个字节。这意味着值不能可靠地用于- GROUP BY,- ORDER BY, 或者- DISTINCT它们仅在第一个- max_sort_length字节后不同。要解决此问题,请增加变量值。默认值为- max_sort_length1024,可以在服务器启动时或运行时更改。
- 数值计算是用 - BIGINTor 完成的- DOUBLE(两者通常都是 64 位长)。您获得的精度取决于功能。一般规则是位函数以- BIGINT精度执行,- IF()并- ELT()以- BIGINTor- DOUBLE精度执行,其余以- DOUBLE精度执行。如果 unsigned long long 值解析为大于 63 位 (9223372036854775807),除了位域之外,您应该尽量避免使用它们。
- 在 - MIN()、- MAX()和其他聚合函数中,MySQL 目前 根据字符串值而不是字符串在集合中的相对位置来 比较- ENUM和 列。- SET
- 在一个 - UPDATE语句中,列从左到右更新。如果您引用更新的列,您将获得更新的值而不是原始值。例如,以下语句递增- KEY,- 2而 不是- 1:- mysql> UPDATE tbl_name SET KEY=KEY+1,KEY=KEY+1;
- 您可以在同一查询中引用多个临时表,但不能多次引用任何给定的临时表。例如,以下内容不起作用: - mysql> SELECT * FROM temp_table, temp_table AS t2; ERROR 1137: Can't reopen table: 'temp_table'
- DISTINCT当您在联接中使用“隐藏”列时 ,优化器的处理方式可能与未使用时不同。在连接中,隐藏列被计为结果的一部分(即使它们没有显示),而在普通查询中,隐藏列不参与- DISTINCT比较。- 这方面的一个例子是: - SELECT DISTINCT mp3id FROM band_downloads WHERE userid = 9 ORDER BY id DESC;- 和 - SELECT DISTINCT band_downloads.mp3id FROM band_downloads,band_mp3 WHERE band_downloads.userid = 9 AND band_mp3.id = band_downloads.mp3id ORDER BY band_downloads.id DESC;- 在第二种情况下,您可能会在结果集中得到两个相同的行(因为隐藏 - id列中的值可能不同)。- 请注意,这仅发生在结果中没有 - ORDER BY列的查询中。
- 如果 - PROCEDURE对返回空集的查询执行 a,在某些情况下- PROCEDURE不会转换列。
- 类型表的创建 - MERGE不会检查基础表是否为兼容类型。
- 如果您使用 - ALTER TABLE向- UNIQUE表中使用的- MERGE表添加索引,然后在表上添加普通索引,- MERGE如果表中有旧的非- UNIQUE键,则表的键顺序不同。这是因为- ALTER TABLE将- UNIQUE索引放在普通索引之前,以便能够尽早检测到重复键。