[groonga-dev,02557] Re: groonga-normalizer-mysql 1.0.6のgrn_nfkc_char_typeでクラッシュ

Back to archive index

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)

以上、よろしくお願いします。



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