细节
-
新功能
-
状态: Done">完成
-
媒介
-
解决方法: 固定
-
此处
-
没有一个
-
没有一个
描述
当一个键有一个ENUM字段时,TableNibbler需要将ENUM字段包装在一个CONCAT stamentent中,因为MySQL处理这些字段的方式。
根据文档:http://dev.mysql.com/doc/refman/5.6/en/enum.html#enum-sorting
ENUM值根据索引号排序,索引号取决于列规范中枚举成员列出的顺序。例如,对于ENUM('b', 'a'), 'b'在'a'之前排序。空字符串在非空字符串之前排序,NULL值在所有其他枚举值之前排序。
为了防止在ENUM列上使用ORDER BY子句时出现意外结果,可以使用以下技术之一:
按字母顺序指定ENUM列表。
通过编码ORDER by CAST(col AS CHAR)或ORDER by CONCAT(col),确保列是按词法排序,而不是按索引号排序。”
因为在这个例子中特征列被定义为' feature '枚举('FOO','BAR','BAT','BAZ','CAT','DOG','DERP','HERP','VANILLA','CHOCOLATE','MINT')(非字母顺序),所以pt-osc的Nibbler无法计算每个块的边界。
看到,-供参考。pt - 272
添加CONCAT会使pt-table checksum等程序变慢(参见pt - 1567)
为了避免这种行为,我们需要做出以下改变:
- 使TableParser检测表定义中的ENUM项是否已经排序。
- 如果它们没有排序:
- 如果——force-concat-enums提供了,继续使用CONCAT包装枚举字段
- 如果-
force-concat-enums是不前提是,死的时候能告诉他枚举字段中包含未排序的项,这会导致明显的减速,并告诉用户他应该指定-force-concat-enums
- 如果它们已排序,则照常进行不使用CONCAT来包装枚举字段