mysql:8439
From: ML account <ML account <ml@xxxxxxxxxx>>
Date: Mon, 01 Dec 2003 18:29:03 +0900
Subject: [mysql 08439] Re: 50 音順検索について
こんにちは。 聖 悠香 <youka_hijiri@xxxxxxxxxx>さんの <BAY7-F32rxTjtRpeVPO0001f694@xxxxxxxxxx> "[mysql 08437] 50 音順検索について" > 【不明点】 > 「select * from DB名.テーブル名 where フィールド名 between "あ" and "お" > order by 挿入場所」 > とした場合『between "あ" and "お"』部分では“お”の言葉が検出されません。 このSQL文のwhere句は文字列の範囲比較をやっています。つまり、 where フィールド名 between "あ" and "お" は where フィールド名 >= "あ" and フィールド名 <= "お" と等価です。まずこれが一点。 文字列の比較の場合、相違する文字のコード以外に文字列の長さも関係します。 "あ" < "い" "あ"は"い"よりも評価値が小さな文字列 "あ" < "あい" "あ"は"あい"よりも評価値が小さな文字列 よって、 where フィールド名 between "あ" and "お" なwhere句はフィールド「フィールド名」の先頭文字が"あ"、"い"、"う"、"え" である場合、及び"お"の場合にマッチします。"おあ"等の先頭文字が"お"であっ ても"お"単体でない場合にはマッチしません。これが二点目、そして > とした場合『between "あ" and "お"』部分では“お”の言葉が検出されません。 の理由でしょう。実際には“お”は選択されていると思いますよ。選択されない のは“お”以外の“お”で始まる言葉のレコードでしょう。 期待する結果を得るにはwhere句の条件を、「先頭文字があ〜おである」とす るか、「文字列"あ"から、"お"で始まる任意の文字列である」とする必要があり ます。 前者の「先頭文字があ〜おである」の例はかわじさんが[mysql 08438]で示さ れた関数 ord()を使う方法もあれば、関数left()を使う方法もあるでしょう。フィー ルド「フィールド名」がbinary付きで作成された場合のwhere句は、 where left(フィールド名,2) between "あ" and "お" binary無しならば、 where left(フィールド名,1) between "あ" and "お" です。3.23のMySQLで使用出来るかは知りませんが、正規表現を使うなら、 where フィールド名 regexp "(あ|い|う|え|お).*" となるでしょう。基本的に同じ考えの様々なバリエーションがあります。 後者の「文字列"あ"から、"お"で始まる任意の文字列である」の場合のwhere 句は、例えばこんなものです。 where フィールド名 >= "あ" and フィールド名 < "か" 松枝知直 <tomom@xxxxxxxxxx> http://www.argus.ne.jp/~tomom/
8437 2003-12-01 16:12 [聖 悠香 <youka_hijir] 50 音順検索について 8438 2003-12-01 16:33 ┣["Kawaji, Shinya" <ka] -> 8439 2003-12-01 18:29 ┗[ML account <ml@xxxxx]