4

看来,当我使用具有类型的order by name语句时,如果它们具有相同的 20 个字段的第一个字符,则我服务器上的 MySQL 不会按正确的顺序放置记录。似乎 MySQL 根本不关心第 21 个字符:当按降序排序时,它实际上保留了相同的错误顺序。namevarchar(255)name

我在另一个 MySQL 安装上复制了我的表,那里一切正常。但是对于服务器上的这种限制,我该怎么办?我无法在那里重新安装 MySQL,因为我使用的是共享主机。

更新:该name字段不属于任何索引,在该字段上创建索引也无济于事。

MySQL 版本是 5.1.55,引擎是 MyISAM。

更新 2:我最初使用cp1251_general_ci排序规则,但后来我尝试了其他排序规则并得到了完全相同的结果。'123456789012345678901'/'123456789012345678902'对于我使用and的字符串'abcdefghijklmnopqrstauvwxyz'/'abcdefghijklmnopqrstbuvwxyz',结果相同。

排序似乎没有考虑从 21 日开始的所有字符,但除此之外它可以正常工作。

有趣的是,当使用第 21 个字符时很重要,但第 22 个字符不重要。ORDER BY substring(name, 2)

4

1 回答 1

3

你能检查你的 max_length_for_sort_data 和 max_sort_length 变量吗?默认值为 1024,如果您将其中之一设置为 20,则说明一切。

mysqladmin -u root -p variables | grep sort
Enter password: 
| max_length_for_sort_data                | 1024                                                                                      |
| max_sort_length                         | 1024                                                                                      |
| myisam_max_sort_file_size               | 2146435072                                                                                |
| myisam_sort_buffer_size                 | 8388608                                                                                   |
| optimizer_switch                        | index_merge=on,index_merge_union=on,index_merge_sort_union=on,index_merge_intersection=on |
| sort_buffer_size                        | 2097144                                                                                   |

您可以在 mysql 服务器手册和max_length_sort_data定义中找到更多信息ORDER BY 优化章节。

于 2012-05-27T13:26:46.897 回答