できることの 1 つは、並べ替えたい列を複製する新しい列を保存することですが、通常の並べ替えアルゴリズムを使用すると自然に並べ替えられる変換された形式で保存します。
概念的には、文字列で発生する可能性のある最長の数値シーケンスと同じ長さになるまで、数字シーケンスの左にゼロを埋め込むことでこれを行うことができます。
私の解決策は完全に頑丈というわけではありませんが、文字列に既知の最大長の数字シーケンスがあるだけの場合は、その既知の最大長までゼロを埋め込むことができます。たとえば、次のようにタイトルにトラック番号が埋め込まれた CD トラック タイトルがあるとします。
1 Foo
2 Bar
...
10 Baz
可能な最長の数値シーケンスが 3 (999 トラックの可能性) になると判断した場合、次のように数値シーケンスをパディングします。
001 Foo
002 Bar
...
010 Baz
これは、複数の数値シーケンスを持つ文字列でうまく機能します。
サンプル php コード。ただし、これを行うために mysql ストアド関数を記述し、テーブルで挿入トリガーと更新トリガーを使用して、テーブルが透過的に維持されるようにします。
$input = 'a44b1c399d4';
$nat = preg_replace_callback('#\d+#', function($m) {
return str_pad($m[0], 3, '0', STR_PAD_LEFT);
}, $input);
echo $nat; // a044b001c399d004
次に、mysqlでソートするだけです
order by natsort_column
これにより、その列にインデックスを配置することもでき、優れたソート パフォーマンスが得られます。