dポイントプレゼントキャンペーン実施中!

| Field  | Type | Null | Key | Default | Extra |
+-----------------+--------------+------+-----+---------+----------------+
| page_id | int(10) | NO | PRI | NULL | auto_increment |
| site   | varchar(255) | YES | MUL | NULL | |
...
...
...


このようなテーブルがあり、以下の様なSELECT文を発行してもEmptyとなってしまいます。

> SELECT `page_id` FROM `table` WHERE `site` = 'hoge';

自分なりに色々と調べてみたところ、

> UPDATE `table` SET `site` = 'fuga' WHERE `page_id` = 1;
> SELECT `page_id` FROM `table` WHERE `site` = 'fuga';

とするとちゃんと1件返ってきます。
ですが、また

> UPDATE `table` SET `site` = 'hoge' WHERE `page_id` = 1;
> SELECT `page_id` FROM `table` WHERE `site` = 'hoge';

とするとEmptyとなってしまいます。

どうやら、INSERTしたレコードをWHERE `site` = 'hoge'するとEmptyとなるような気がします。
何度も試したので、単純に`site` = 'hoge'の文字列自体が間違っている、などのことは無いはずです。
以下の点も合わせて、どのような原因が考えられるでしょうか。

・レコードのINSERTは、クローラーによって行われていています。
・他のフィールドは通常通りSELECTすることができます。
・ストレージエンジンはmroongaです。

どなたか解決策がわかる方いらっしゃいましたら、ご回答頂ければ幸いです。
宜しくお願い致します。

A 回答 (4件)

SELECT page_id, site, LENGTH(site), HEX(site)


FROM videos
WHERE site LIKE '%hoge';

の実行結果を念のため確認するとどうなるでしょう?
正しく'hoge'が格納されているなら,LENGTH()は4バイトになるでしょうし,HEX()表記は686f6765になるでしょう。

この回答への補足

site | LENGTH(site) | HEX(site)
fc2 | 3 | 666332


実際に格納されているデータはhogeでなくfc2ですのでLENGTHは3になりました。HEXは666332です。

補足日時:2012/06/20 00:23
    • good
    • 0

mroongaエンジンを試す環境がないためなんともいえませんが


別のエンジンで試してみてはどうでしょう?
別のエンジンで問題ないなら場合によってはmroongaエンジンの
何らかの特性や制限の可能性もあるので、そちらの専門サイトで
仕様を確認してみてください
    • good
    • 0

 ためしに、識別子(テーブル名・フィールド名)を囲っているバッククォートを無しにするとどうなりますか?ようするに、識別子は何も囲わないということです。


 これでうまくいくようなら、sql_mode制御変数あたりを調べてみる感じかなぁ

この回答への補足

回答ありがとうございます。

> SELECT page_id FROM videos WHERE site = 'hoge';

としてみましたが、やはりEmptyでした。


また、=ではなくLIKEを使用してみたところ

> site LIKE '%hoge';
> site LIKE '_oge';

この2つの方法で期待通りの結果が取得できました。
以下のようなクエリだとEmptyとなります。

> site LIKE 'hoge%';
> site LIKE '_hoge';


また引き続き宜しくお願い致します。

補足日時:2012/06/19 23:15
    • good
    • 0

UPDATE `table` SET `site` = 'hoge' WHERE `page_id` = 1;


SELECT `page_id`,`site` FROM `table` WHERE `page_id` = 1';
を実行してみたら何かわかるんじゃない?

`page_id` = 1'の時に`site`に何が入っているか確認するのがまず最初だと思いますよ。
自分の期待する値のデータがセットされているかどうか確認するのが鉄則ですよ。

それでセットされていることが確認できたら
SELECT `page_id` FROM `table` WHERE `site` = 'hoge';
を実行してみたらどうですか?
調査はその後ですね。

後、COMMIT;を忘れているとか?さすがにそれは無いか?

この回答への補足

回答有り難うございます。

`page_id` = 1'の時に`site`に何が入っているか

ということですが、もちろんそれは把握済みですし、それが間違っているというイージーミスは考えにくいです。
>何度も試したので、単純に`site` = 'hoge'の文字列自体が間違っている、などのことは無いはずです。

なお、`site`には現在2種類の文字列しか入っていません。そのどちらもSELECTでEmptyが返ってきます。
ですが、UPDATEを行なって、UPDATE後の文字列をSELECTするとちゃんと1件返ってきます。


`site`に'hoge'を入れる

`site`='hoge'でSELECT

Empty


その'hoge'をUPDATEで'fuga'に変更

`site`='fuga'でSELECT

1件返ってくる


その'fuga'をUPDATEで再度'hoge'に戻す

`site`='hoge'でSELECT

やはりEmpty


という状態です。

引き続き宜しくお願い致します。

補足日時:2012/06/19 21:56
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!