次の2つの結果をスローするクエリがあります。
_SELECT id FROM table1 WHERE id like 'nm041033%'
_
そして、1つの結果のみをスローするこの少し異なるクエリ:
_SELECT id FROM table1 WHERE id='nm0410331'
_
私は最後の文字のASCII=をチェックして同じを得た:
_SELECT id,ascii(substr(id,9,1)) FROM table1 WHERE id like 'nm041033%'
_
まれなエンコーディングの問題だと思います。どうすれば解決できますか?
PS:フィールドid
は主キーです。文字セットは_latin1_general_ci
_であり、値はPHP utf8_decode()
を使用して挿入されました。
PDATE:文字セットを_ascii_general_ci
_に変更したところ、このクエリで結果が0になりました。
_SELECT id FROM table1 WHERE id='nm0410331'
_
ただし、これら2つのIDはまだ同じではありません。 _SELECT DISTINCT
_または_GROUP BY
_を使用すると、2つの行が表示されます。
PS:最後の文字は、キーボードで入力できる数字ではありません。
フィールドをチェックするためにHEX()
を使用することを提案した Akina の洞察のおかげで、値の1つの末尾に余分な「0A」バイトが見つかりました。
(一時的な重複IDを回避するために)主キーのコントラストを削除した後、私は次のように使用しました:UPDATE table1 SET id = TRIM(TRAILING UNHEX('0A') FROM id);
そして、それを解決することができました。
PS:将来のGoogle社員のために、SELECT id FROM table1 WHERE id like 'nm0410331%'
私の愚かな問題にも気付かせることができます...
理想的には、データを「クリーンアップ」する必要はないはずです。TRIMを使用してデータを入力し、適切なエスケープ関数を使用する必要があります...改行がそこに忍び込む可能性がある場合-おそらく単一引用符も..とこんにちは、SQLインジェクションへようこそ...