### B.3.7 MySQL 中的已知问题 [](<>)[](<>)[](<>)[](<>) 本节列出了 MySQL 最新版本中的已知问题。 有关特定于平台的问题的信息,请参阅安装和调试说明[第 2.1 节,“一般安装指南”](general-installation-issues.html), 和[第 5.9 节,“调试 MySQL”](debugging-mysql.html). 已知以下问题: - 子查询优化`在`不如`=`. - 即使你使用`lower_case_table_names=2`(这使 MySQL 能够记住用于数据库和表名的大小写),MySQL 不记住用于函数的数据库名称的大小写[`数据库()`](information-functions.html#function_database)或在各种日志中(在不区分大小写的系统上)。 - 丢弃一个`外键`约束在复制中不起作用,因为该约束在副本上可能有另一个名称。 - [`代替`](replace.html)(和[`加载数据`](load-data.html)与[`代替`](replace.html)选项)不触发`删除级联`. - `清楚的`和`订购方式`在里面不起作用[`GROUP_CONCAT()`](aggregate-functions.html#function_group-concat)如果您不使用所有且仅使用`清楚的`列表。 - 当插入一个大整数值(263和 264-1) 到十进制或字符串列中,它作为负值插入,因为该数字是在有符号整数上下文中评估的。 - 使用基于语句的二进制日志,源服务器将执行的查询写入二进制日志。这是一种非常快速、紧凑且高效的日志记录方法,在大多数情况下都能完美运行。但是,如果查询的设计方式使得数据修改是不确定的(通常不推荐做法,即使在复制之外),源和副本上的数据可能会变得不同。 例如: - [`创建表...选择`](create-table-select.html)要么[`插入...选择`](insert-select.html)插入零或的语句`空值`值成`自动递增`柱子。 - [`删除`](delete.html)如果您要从具有外键的表中删除行`关于删除级联`财产。 - [`代替选择`](replace.html),`插入忽略。。。选择`如果插入的数据中有重复的键值。 **当且仅当前面的查询没有`订购人`保证确定顺序的条款**. 例如[`插入选择`](insert-select.html)没有`订购人`这个[`选择`](select.html)可以以不同的顺序返回行(这会导致一行具有不同的秩,因此在`自动增量`列),这取决于优化器对源和副本所做的选择。 只有在以下情况下,查询才会在源和副本上进行不同的优化: - 该表在源上的存储引擎与在副本上的存储引擎不同。(可以在源和副本上使用不同的存储引擎。例如`InnoDB`在源头上,但是`米萨姆`如果复制副本的可用磁盘空间较少,则在复制副本上。) - MySQL缓冲区大小([`按键缓冲区大小`](server-system-variables.html#sysvar_key_buffer_size),等等)在源和副本上是不同的。 - 源和副本运行不同的MySQL版本,这些版本之间的优化器代码也不同。 此问题还可能影响使用**mysqlbinlog | mysql**. 避免此问题的最简单方法是添加`订购人`子句,以确保行始终以相同的顺序存储或修改。使用基于行或混合日志格式也可以避免这个问题。 - 如果未使用启动选项指定文件名,则日志文件名基于服务器主机名。要在将主机名更改为其他名称时保留相同的日志文件名,必须明确使用以下选项:[`--木箱=*`老东道主`*-垃圾箱`](replication-options-binary-log.html#option_mysqld_log-bin)看见[第5.1.7节“服务器命令选项”](server-options.html)。或者,重命名旧文件以反映主机名的更改。如果这些是二进制日志,则必须编辑二进制日志索引文件,并在那里修复二进制日志文件名。(副本上的中继日志也是如此。) - [**mysqlbinlog**](mysqlbinlog.html)不删除删除删除后留下的临时文件[`加载数据`](load-data.html)陈述看见[第4.6.9节,“mysqlbinlog-处理二进制日志文件的实用程序”](mysqlbinlog.html). - `改名`不适用于`短暂的`桌子或在一个房间里使用的桌子`合并`桌子 - 使用时`集合字符集`,则不能在数据库、表和列名中使用翻译后的字符。 - 在MySQL 8.0.17之前,您不能使用`_`或`%`具有`逃跑`在里面[`喜欢逃跑`](string-comparison-functions.html#operator_like). - 服务器只使用第一个[`最大排序长度`](server-system-variables.html#sysvar_max_sort_length)比较数据值时的字节数。这意味着这些值不能可靠地用于`分组`, `订购人`或`不同的`如果他们只在第一次[`最大排序长度`](server-system-variables.html#sysvar_max_sort_length)字节。要解决这个问题,请增加变量值。的默认值[`最大排序长度`](server-system-variables.html#sysvar_max_sort_length)是1024,可以在服务器启动时或运行时更改。 - 数值计算是用[`比金`](integer-types.html)或[`双重的`](floating-point-types.html)(两者通常都是64位长)。精度取决于函数。一般规则是,位函数是通过[`比金`](integer-types.html)精确[`如果()`](flow-control-functions.html#function_if)和[`ELT()`](string-functions.html#function_elt)具有[`比金`](integer-types.html)或[`双重的`](floating-point-types.html)精确,其余的用[`双重的`](floating-point-types.html)精确如果解析为大于63位(9223372036854775807)的无符号long-long值用于位字段以外的任何内容,则应尽量避免使用无符号long-long值。 - 最多可以有255个[`枚举`](enum.html)和[`设置`](set.html)一个表中的列。 - 在里面[`MIN()`](aggregate-functions.html#function_min), [`麦克斯()`](aggregate-functions.html#function_max),以及其他聚合函数,MySQL目前正在进行比较[`枚举`](enum.html)和[`设置`](set.html)列的值,而不是字符串在集合中的相对位置。 - 在一个[`使现代化`](update.html)语句中,列从左到右更新。如果引用更新的列,则会得到更新的值,而不是原始值。例如,下面的语句递增`钥匙`通过`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; ``` 在第二种情况下,可能会在结果集中得到两个相同的行(因为`身份证件`列可能有所不同)。 请注意,这种情况仅适用于没有`订购人`结果中的列。 - 如果你执行`程序`在返回空集的查询中,在某些情况下`程序`不转换列。 - 创建类型为`合并`不检查基础表是否为兼容类型。 - 如果你使用[`改变桌子`](alter-table.html)添加`唯一的`索引中使用的表`合并`表,然后在`合并`表,如果有一个旧的、非-`唯一的`把钥匙放在桌子上。这是因为[`改变桌子`](alter-table.html)放`唯一的`在正常索引之前进行索引,以便能够尽早检测重复密钥。