ranguba / rroonga

The Ruby bindings of Groonga.
http://ranguba.org/#about-rroonga
66 stars 26 forks source link

grndump で index を含むテーブルをダンプしようとすると大量のwarningが出る #10

Closed genki closed 11 years ago

genki commented 11 years ago

grndump コマンドを利用して、key がバイナリデータになるような index を含むテーブルをダンプしようとすると、大量に "ignore invalid encoding character" という warning が出るようです。問題が発生するのは以下のようなindexを含む tableです。

::Groonga::Schema.change_table("Foo") do |t|
  t.index "Bar.id_number"
end

groonga コマンドで dump する場合には warning が発生しないので、rroonga 側で バイナリデータとして扱うべき key を文字列として扱ってしまっているのではないかと思います。

kou commented 11 years ago

Fooのキーの型を教えてもらえますか?(ShortTextかしら。) あと、Bar.id_numberの型とサンプルデータをいくつかもらえるとさらにうれしいです!

genki commented 11 years ago

キーの型は無指定なのでデフォルトですね。 :key_type => :uint32 とかにしたら個人的には問題は解決するのですが、 デフォルトのkey_typeの場合でdumpしようとすると問題が発生するので ひとまずご報告まで。

kou commented 11 years ago

Fooの:typeは:hashで、:key_typeは無指定なんですね。

そもそも、インデックス用のテーブルのキーとインデックス対象のカラムの型を揃えないとうまく動かないはずなので、そのケースにはあんまりがんばって対応しなくてもいいかなぁという感じです。例えば、Fooのキーの型がShortTextでBar.id_numberの型がShortTextでもTextでもLongTextでもないケースです。

それはそれとしてバイナリデータが入ったText系の値をダンプできるようにするのはがんばってもいいかなぁという気はします!が、意図的にバイナリデータなのかうっかりバイナリデータなのかを判断するのが難しいんですよねぇ。

今は、全部UTF-8として正しい文字列が入っているとして、不正な文字が入っているかどうかを明示的にvalid_encodig?して確かめています。

genki commented 11 years ago

了解です。 とりあえずどうしても必要なケースは思いつかなかったのでcloseしときますね。

kou commented 11 years ago

はい! 実は、今でも1つバイナリデータが入るケースがあるんです。それは、mroongaでマルチカラムインデックスを使った時です。でも、そのときはmysqldumpするよなぁ、というのでgrndumpは使わなそうなんですよねぇ。