1

varcharMySQL データベースに、任意の文字と数字を含むテキストを格納する列があります。

スキーマはutf8、文字セットおよびutf8_unicode_ci照合順序として使用します。InnoDBトランザクションを使用する必要があるため、データベース エンジンとして使用されます。

私がやりたいことは、ORDER BYそのコラムを自然にできるようになることです。たとえば、次のサンプル データがあります。

12234 some random text
my text 23
mytext3
123456abcd
text23
text1
text111
text33

テスト データをテスト テーブルに挿入した後、クエリと列を実行ORDER BYします。varcharASC

SELECT * FROM `test` WHERE 1 ORDER BY data ASC;

問題は、数値の「サイズ」が考慮されていないことです。

12234 some random text
123456abcd
my text 23
mytext3
text1
text111 <-------
text23
text33

次に、(ほぼ)解決策を提供するこの質問を見つけました:

SELECT * FROM `test` WHERE 1 ORDER BY data * 1 DESC;

123456abcd             <------ These 2 should
12234 some random text <------ be swapped
my text 23
mytext3
text23
text1
text33
text111

上記のもう1つの欠点は、各行に操作があるため、上記がインデックスを使用できないことです。

また、ラテン文字以外の文字を導入すると、どのような効果が得られるかわかりません.

MySQL に自然言語ソートを実行させる効率的な方法はありますか?

4

1 に答える 1

0

あなたは尋ねました:

   Is there a performant way to get MySQL to perform natural language sorting?

短い答え:いいえ。

より長い答え:

おそらく、選択した照合と数値テキストを 2 進数であるかのように使用して、非数値テキストを処理する方法で MySQL に日付を照合させたいと考えています。

照合のために何らかの代理キーを作成し、それを独自の列に格納する必要があります。このように各テキスト文字列を変換し、元の文字列と代理キー文字列の両方を dbms にロードすることでこれを行うことができます。

Original Text                   Surrogate Key Text
12234 some random text          0000012234 some random text
my text 23                      my text 0000000023
mytext3                         mytext0000000003
123456abcd                      0000123456abcd
text23                          text0000000023
text1                           text0000000001
text111                         text0000000111
text33                          text0000000033
1text123                        0000000001text0000000123
2text124                        0000000002text0000000124

この例では、サンプル内の数値データの各チャンクが 10 桁の 10 進数に詰め込まれていることに注意してください。

これは、DBMS をロードするときにアプリケーションで行うのが最も簡単です。それを行う簡単な文字列解析ルーチンを書くことができます。使用しているアプリケーション言語を教えてくれませんでした。

作成する各クエリで限られた数のレコードのみを照合する場合は、レコードを取得した後にアプリケーションで照合できる場合もあります。

于 2012-07-24T01:38:05.690 に答える