Mysql

不同的字元,相同的ASCII碼?

  • October 8, 2019

我有這個查詢會引發兩個結果:

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

這個稍微不同的查詢只拋出一個結果:

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()


**更新:**我將字元集更改為ascii_general_ci,現在這個查詢給了我零結果:

SELECT id FROM table1 WHERE id='nm0410331'

但是,這兩個 id 還不一樣。如果我使用SELECT DISTINCT或者GROUP BY我得到兩行。

PS:最後一個字元不是你可以用鍵盤輸入的數字。

感謝Akina的洞察力,他建議用於HEX()檢查該欄位,我在其中一個值的末尾發現了一個額外的“0A”字節。

刪除主鍵約束(以避免臨時重複 id)後,我使用: UPDATE table1 SET id = TRIM(TRAILING UNHEX('0A') FROM id); 並且能夠解決它。

PS:對於未來的Google人,使用SELECT id FROM table1 WHERE id like 'nm0410331%'也可以讓我注意到我的愚蠢問題……

理想情況下,您不必“清理”數據-您應該使用TRIM填充它們-並使用適當的轉義功能…如果換行符可以潛入那裡-很可能也是單引號..你好, 歡迎使用 SQL 注入….

引用自:https://dba.stackexchange.com/questions/250403