4

タイプがあるorder by nameステートメントを使用している場合、サーバーのMySQLは、フィールドの最初の20文字が同じである場合、レコードを適切な順序で配置しないようです。MySQLは21文字をまったく気にしないようです。降順で並べ替えるときに、実際には同じ誤った順序が保持されます。namevarchar(255)name

別のMySQLインストールでテーブルを複製しましたが、すべて問題ありません。しかし、サーバーでのこの制限についてはどうすればよいですか?共有ホスティングを使用しているため、MySQLを再インストールできません。

更新nameフィールドはどのインデックスにも属しておらず、このフィールドにインデックスを作成しても役に立ちません。

MySQLのバージョンは5.1.55、エンジンはMyISAMです。

更新2:元々cp1251_general_ci照合を使用していましたが、他の照合を試したところ、まったく同じ結果が得られました。私が使用した文字列'123456789012345678901'/'123456789012345678902''abcdefghijklmnopqrstauvwxyz'/'abcdefghijklmnopqrstbuvwxyz'、同じ結果。

順序付けでは、21日以降のすべての文字が考慮されていないようですが、それ以外の場合は正常に機能しています。

興味深いことに、21番目の文字を使用する場合は重要ですが、22番目の文字は重要ではありません。ORDER BY substring(name, 2)

4

1 に答える 1

3

max_length_for_sort_data変数とmax_sort_length変数を確認できますか?デフォルトは1024ですが、そのうちの1つを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サーバーのマニュアルの「ORDERBY最適化」の章とmax_length_sort_dataの定義を参照してください。

于 2012-05-27T13:26:46.897 に答える