web-dev-qa-db-ja.com

異なる文字、同じASCIIコード?

次の2つの結果をスローするクエリがあります。

_SELECT id FROM table1 WHERE id like 'nm041033%'
_
  1. nm0410331
  2. nm0410331

そして、1つの結果のみをスローするこの少し異なるクエリ:

_SELECT id FROM table1 WHERE id='nm0410331'
_
  1. nm0410331

私は最後の文字のASCII=をチェックして同じを得た:

_SELECT id,ascii(substr(id,9,1)) FROM table1 WHERE id like 'nm041033%'
_
  1. nm0410331 49
  2. nm0410331 49

まれなエンコーディングの問題だと思います。どうすれば解決できますか?

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:最後の文字は、キーボードで入力できる数字ではありません。

4

フィールドをチェックするために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%'私の愚かな問題にも気付かせることができます...

4

理想的には、データを「クリーンアップ」する必要はないはずです。TRIMを使用してデータを入力し、適切なエスケープ関数を使用する必要があります...改行がそこに忍び込む可能性がある場合-おそらく単一引用符も..とこんにちは、SQLインジェクションへようこそ...

2
eagle275