2

「Like」を使用した非常に単純なクエリを使用して、名前で製品を検索します

SELECT p_pid, p_name, p_cat
FROM products
WHERE p_sid=346 AND p_name LIKE 'product name here in utf-8 encoding, can be various languages'
LIMIT 1

有効な製品名を使用してコードからこのクエリを実行すると、結果が得られません。クエリ (php によってブラウザにエコーされる) をコピーし、mysql クエリ ブラウザで手動で実行すると、結果が得られます。私が間違っている場所はありますか?

ノート:

1.クエリからのエラーはありません。結果が出ないだけ。2. ezsql ライブラリを使用しています。 3. コードは正常に動作し、コード内の同じスコープでデータベースを使用して他の SELECT を正常に実行します。

4

3 に答える 3

3

エンコーディングの問題のようです。

このクエリを実行してみてください:

SELECT HEX(CAST('product name here in utf-8 encoding, can be various languages' AS BINARY))

とクエリ ブラウザの両方でezSQL結果を比較します。

MySQLこれにより、実際にクライアントから取得して比較で使用するバイナリ ストリームが得られます。

プロパティで間違った接続エンコーディングを設定するezSQLと、文字列が壊れる可能性があります (記号の代わりに疑問符が表示されるなどUTF)。

この場合、もちろん比較は失敗します。

アップデート:

大文字と小文字を区別しない照合を強制してみてください。

SELECT  *
FROM    table
WHERE   field LIKE 'product name here in utf-8 encoding, can be various languages' COLLATE UTF8_GENERAL_CI

また、文字列とフィールドに含まれるデータの両方のバイナリ ダンプを投稿していただけますか?

SELECT  p_pid, p_name, p_cat,
        HEX(CAST(p_name AS BINARY)),
        HEX(CAST('product name here in utf-8 encoding, can be various languages' AS BINARY))
FROM    products
WHERE   p_pid = @pid_of_product_that_should_match_but_it_doesnt
于 2009-05-31T10:51:15.737 に答える
1

手動で実行されるスクリプトと自動で実行されるスクリプトの間で、マシン、データベース、およびユーザーは同じですか? 一方がテスト サーバーにアクセスし、もう一方が本番サーバーにアクセスしている可能性があります (たとえば)。

于 2009-05-31T12:44:39.500 に答える
0

コードを介して正しい情報を送信していないコーディングエラーである可能性があります。そのため、何かを検索しているため、エラーはありませんが、検索することを意図したものではありません. コードを手動でスキャンし、ビットをやり直して、問題の可能性があるものを見つけるかどうかを確認します。

PHP のスニペットは、コーディング エラーのように見える場合に役立ちます。

お役に立てれば。

于 2009-05-31T11:10:01.190 に答える