[groonga-dev,00783] Re: 文字列カラムのソート順が日本語が先になる

Back to archive index

Kouhei Sutou kou****@clear*****
2012年 4月 18日 (水) 14:37:32 JST


須藤です。

In <20120417215803wU$1GY****@gmail*****>
  "[groonga-dev,00779] 文字列カラムのソート順が日本語が先になる" on Tue, 17 Apr 2012 21:58:03 +0900,
  Shinya Kawaji <kawaj****@gmail*****> wrote:

> 文字列型カラム(text/short_text)をソート順に使った場合、一般的な
> 文字コード順である「記号」「数字」「英字」「日本語」になることを
> 期待していたのですが、実際は「日本語」が先になって、他が後になります。

現象を確認しました!
groongaのソースコードを確認したところ、バイト列ではなく文字
列として比較している箇所がありました。(C言語でいうと
unsigned charではなくcharで比較していた。)

で、groonga的にはバイト列として比較してソートするのが他の箇
所とも整合性がとれるため、そちらの方が適切です。ということで、
groongaの問題なので、修正します!

> これを、「日本語が先になる」ようにするにはどのような方法が有りますでしょ
> うか。

次のgroongaのリリースをお待ちください。。。
ということになります。

> それと出来れば、現時点での「日本語が先になる理由(仕組み)」を知りたいの
> ですが、どのように理解すればよいでしょうか。

↑をもう少し詳しく説明しますね。

例にあったそれぞれの文字列の1バイト目は以下のようになっていま
す。

  p "(社)".unpack("C")[0] # -> 40 
  p "222".unpack("C")[0]  # -> 50 
  p "cs".unpack("C")[0]   # -> 99 
  p "黒".unpack("C")[0]   # -> 233

これを使って大きい順に並べると

  ["(社)", "222", "cs", "黒"]

という意図した順番になります。

しかし、1バイト目を1バイトの符号付き整数として扱うと

  p "(社)".unpack("c")[0] # -> 40 
  p "222".unpack("c")[0]  # -> 50 
  p "cs".unpack("c")[0]   # -> 99 
  p "黒".unpack("c")[0]   # -> -23

となるので、これを使って大きい順に並べると

  ["黒", "(社)", "222", "cs"]

という現在の挙動になります。


-- 
須藤 功平 <kou****@clear*****>
株式会社クリアコード <http://www.clear-code.com/> (03-6231-7270)

プログラミングが好きなソフトウェア開発者を募集中:
  http://www.clear-code.com/recruitment/




groonga-dev メーリングリストの案内
Back to archive index