# B.3.7 MySQL 中的已知问题

本节列出了 MySQL 最新版本中的已知问题。

有关特定于平台的问题的信息,请参阅安装和调试说明第 2.1 节,“一般安装指南”, 和第 5.9 节,“调试 MySQL”.

已知以下问题:

  • 子查询优化不如=.

  • 即使你使用lower_case_table_names=2(这使 MySQL 能够记住用于数据库和表名的大小写),MySQL 不记住用于函数的数据库名称的大小写数据库()或在各种日志中(在不区分大小写的系统上)。

  • 丢弃一个外键约束在复制中不起作用,因为该约束在副本上可能有另一个名称。

  • 代替(和加载数据代替选项)不触发删除级联.

  • 清楚的订购方式在里面不起作用GROUP_CONCAT()如果您不使用所有且仅使用清楚的列表。

  • 当插入一个大整数值(263和 264-1) 到十进制或字符串列中,它作为负值插入,因为该数字是在有符号整数上下文中评估的。

  • 使用基于语句的二进制日志,源服务器将执行的查询写入二进制日志。这是一种非常快速、紧凑且高效的日志记录方法,在大多数情况下都能完美运行。但是,如果查询的设计方式使得数据修改是不确定的(通常不推荐做法,即使在复制之外),源和副本上的数据可能会变得不同。

    例如:

    • 创建表...选择要么插入...选择插入零或的语句空值值成自动递增柱子。

    • 删除如果您要从具有外键的表中删除行关于删除级联财产。

    • 代替选择,插入忽略。。。选择如果插入的数据中有重复的键值。

    当且仅当前面的查询没有订购人保证确定顺序的条款.

    例如插入选择没有订购人这个选择可以以不同的顺序返回行(这会导致一行具有不同的秩,因此在自动增量列),这取决于优化器对源和副本所做的选择。

    只有在以下情况下,查询才会在源和副本上进行不同的优化:

    • 该表在源上的存储引擎与在副本上的存储引擎不同。(可以在源和副本上使用不同的存储引擎。例如InnoDB在源头上,但是米萨姆如果复制副本的可用磁盘空间较少,则在复制副本上。)

    • MySQL缓冲区大小(按键缓冲区大小,等等)在源和副本上是不同的。

    • 源和副本运行不同的MySQL版本,这些版本之间的优化器代码也不同。

      此问题还可能影响使用mysqlbinlog | mysql.

      避免此问题的最简单方法是添加订购人子句,以确保行始终以相同的顺序存储或修改。使用基于行或混合日志格式也可以避免这个问题。

  • 如果未使用启动选项指定文件名,则日志文件名基于服务器主机名。要在将主机名更改为其他名称时保留相同的日志文件名,必须明确使用以下选项:--木箱=*老东道主*-垃圾箱看见第5.1.7节“服务器命令选项”。或者,重命名旧文件以反映主机名的更改。如果这些是二进制日志,则必须编辑二进制日志索引文件,并在那里修复二进制日志文件名。(副本上的中继日志也是如此。)

  • mysqlbinlog不删除删除删除后留下的临时文件加载数据陈述看见第4.6.9节,“mysqlbinlog-处理二进制日志文件的实用程序”.

  • 改名不适用于短暂的桌子或在一个房间里使用的桌子合并桌子

  • 使用时集合字符集,则不能在数据库、表和列名中使用翻译后的字符。

  • 在MySQL 8.0.17之前,您不能使用_%具有逃跑在里面喜欢逃跑.

  • 服务器只使用第一个最大排序长度比较数据值时的字节数。这意味着这些值不能可靠地用于分组, 订购人不同的如果他们只在第一次最大排序长度字节。要解决这个问题,请增加变量值。的默认值最大排序长度是1024,可以在服务器启动时或运行时更改。

  • 数值计算是用比金双重的(两者通常都是64位长)。精度取决于函数。一般规则是,位函数是通过比金精确如果()ELT()具有比金双重的精确,其余的用双重的精确如果解析为大于63位(9223372036854775807)的无符号long-long值用于位字段以外的任何内容,则应尽量避免使用无符号long-long值。

  • 最多可以有255个枚举设置一个表中的列。

  • 在里面MIN(), 麦克斯(),以及其他聚合函数,MySQL目前正在进行比较枚举设置列的值,而不是字符串在集合中的相对位置。

  • 在一个使现代化语句中,列从左到右更新。如果引用更新的列,则会得到更新的值,而不是原始值。例如,下面的语句递增钥匙通过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'
    
  • 优化器可以处理不同的在联接中使用“隐藏”列的情况与不使用“隐藏”列的情况不同。在联接中,隐藏列被计算为结果的一部分(即使它们没有显示),而在正常查询中,隐藏列不参与查询不同的比较

    这方面的一个例子是:

    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;
    

    在第二种情况下,可能会在结果集中得到两个相同的行(因为身份证件列可能有所不同)。

    请注意,这种情况仅适用于没有订购人结果中的列。

  • 如果你执行程序在返回空集的查询中,在某些情况下程序不转换列。

  • 创建类型为合并不检查基础表是否为兼容类型。

  • 如果你使用改变桌子添加唯一的索引中使用的表合并表,然后在合并表,如果有一个旧的、非-唯一的把钥匙放在桌子上。这是因为改变桌子唯一的在正常索引之前进行索引,以便能够尽早检测重复密钥。