MySQL在订购记录时仅使用字符串的前20个字符

时间:2012-05-24 16:45:57

标签: mysql sql-order-by

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

我在另一个MySQL安装上复制了我的表,一切都很好。但是我如何处理服务器上的这种限制呢?我无法在那里重新安装MySQL,因为我正在使用共享主机。

更新cp1251_general_ci字段不属于任何索引,并且在此字段上创建索引也无济于事。

MySQL版本是5.1.55,引擎是MyISAM。

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

排序似乎没有考虑从21日开始的所有角色,但是否则它正在按预期工作。

有趣的是,当使用name时,第21个字符很重要,但第22个字符不重要。

1 个答案:

答案 0 :(得分: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                                                                                   |

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