Naoya Murakami
visio****@gmail*****
2014年 7月 31日 (木) 02:19:55 JST
村上です。 > ちなみに、同じ文字列 > > concat(0xd6, 0xbc, 0xde, 0xac, 0xc9, 0x93, 0x27) > > をMySQL標準のutf8_unicode_ciで正規化したときはどんな文字列に > > なるかわかりますか?groonga-normalizer-mysqlも同じ挙動にしよ > > うと思います。 > > > > たぶん、元の文字がそのままでてくるか、文字が消えてしまうかの > > どちらかだと思うんですが。。。元の文字かなぁ。 > > これ、だれか確認してもらえないでしょうか。。。 > > 正規化後の文字列を確認する方法というのがわからなかったので、 mysql-test/r/ctype_uca.resultを参考にして、weight_stringで正規化後の値の 変化を確認してみました。 まず、 set collation_connection=utf8_general_ci; select @@collation_connection; をして、"utf8_general_ci"に設定します。 なお、"utf8_unicode_ci"に設定すると、拡張サポート(1文字が2文字に延びるとか) の関係からか以下の方法で取得されるコードが単純なutf8の文字コードじゃ ない値が返ってくるのでutf8_general_ciで試しています。 (utf8_unicode_ciに設定して試すと「A」と「A」、「ば」と「ハ」などで同じ値が 帰ってくるのでたぶん正規化はされています) http://dev.mysql.com/doc/refman/5.1/ja/charset-unicode-sets.html utf8_general_ciのcollationを設定した状態で、以下のようにすると、 正規化後ぽい文字コードが得られます。 (以下の例では"a"→" A"に。) SELECT HEX('a'), CAST(0x61 as char), HEX(weight_string(cast(0x61 as char))) AS Normalized , LENGTH(weight_string(cast(0x61 as char))) AS Bytes; +----------+--------------------+------------+-------+ | HEX('a') | CAST(0x61 as char) | Normalized | Bytes | +----------+--------------------+------------+-------+ | 61 | a | 0041 | 2 | +----------+--------------------+------------+-------+ 1 row in set (0.00 sec) この方法で、(0xd6, 0xbc, 0xde, 0xac, 0xc9, 0x93, 0x27)を試してみます。 ちなみに(0xd6, 0xbc, 0xde, 0xac, 0xc9, 0x93)は_utf8を指定してcast しようとすると無効な文字コードとされます。 mysql> SELECT CAST(_utf8 0xd6 as char); ERROR 1300 (HY000): Invalid utf8 character string: 'D6' 以下の結果を見ると、無効な文字コードを渡すとweight_stringでは何も 返ってこないようです。 ただ、検索時にもこのweight_string相当のことをしているかどうかはよく わかりません。ソースコードまでは追えてません。 私がさくっと確認できたのはこの程度でした。。参考になりますかね? 検討違いの検証でしたら失礼しました。 mysql> SELECT CAST(0xd6 as char), HEX(weight_string(cast(0xd6 as char))) AS Normalized , LENGTH(weight_string(cast(0xd6 as char))) AS Bytes; +--------------------+------------+-------+ | CAST(0xd6 as char) | Normalized | Bytes | +--------------------+------------+-------+ | ヨ | | 0 | +--------------------+------------+-------+ 1 row in set (0.00 sec) mysql> SELECT CAST(0xbc as char), HEX(weight_string(cast(0xbc as char))) AS Normalized , LENGTH(weight_string(cast(0xbc as char))) AS Bytes; +--------------------+------------+-------+ | CAST(0xbc as char) | Normalized | Bytes | +--------------------+------------+-------+ | シ | | 0 | +--------------------+------------+-------+ 1 row in set (0.00 sec) mysql> SELECT CAST(0xde as char), HEX(weight_string(cast(0xde as char))) AS Normalized , LENGTH(weight_string(cast(0xde as char))) AS Bytes; +--------------------+------------+-------+ | CAST(0xde as char) | Normalized | Bytes | +--------------------+------------+-------+ | ゙ | | 0 | +--------------------+------------+-------+ 1 row in set (0.00 sec) mysql> SELECT CAST(0xac as char), HEX(weight_string(cast(0xac as char))) AS Normalized , LENGTH(weight_string(cast(0xac as char))) AS Bytes; +--------------------+------------+-------+ | CAST(0xac as char) | Normalized | Bytes | +--------------------+------------+-------+ | ャ | | 0 | +--------------------+------------+-------+ 1 row in set (0.00 sec) mysql> SELECT CAST(0xc9 as char), HEX(weight_string(cast(0xc9 as char))) AS Normalized , LENGTH(weight_string(cast(0xc9 as char))) AS Bytes; +--------------------+------------+-------+ | CAST(0xc9 as char) | Normalized | Bytes | +--------------------+------------+-------+ | ノ | | 0 | +--------------------+------------+-------+ 1 row in set (0.00 sec) mysql> SELECT CAST(0x27 as char), HEX(weight_string(cast(0x27 as char))) AS Normalized , LENGTH(weight_string(cast(0x27 as char))) AS Bytes; +--------------------+------------+-------+ | CAST(0x27 as char) | Normalized | Bytes | +--------------------+------------+-------+ | ' | 0027 | 2 | +--------------------+------------+-------+ 1 row in set (0.00 sec) 以上、よろしくお願いします。