2012-04-13 139 views
0

我與MySql存在問題 我有一個包含來自網站的已解析信息的表。一個奇怪的字符串解釋出現:對等值的Mysql字符串檢查對於相同的值爲false

查詢

select id, address from pagesjaunes_test where address = substr(address,1,length(address)-1) 

返回一組

在開始的時候我執行的功能價值,而不是無的:

address = replace(address, '\n', '') 
address = replace(address, '\t', '') 
address = replace(address, '\r', '') 
address = replace(address, '\r\n', '') 
address = trim(address) 

,但問題仍然存在。

字段「地址」的值有一些法語字符,但查詢返回的值也只包含alfanumeric英語字符。

另一個測試:我試圖檢查字符串的長度和...來自PHP的strlen()和來自MYSQL的LENGTH()顯示不同的結果!某處不同之處在於2個字符,某處是1個字符,沒有特定的「規則」。

Visual我看不到任何空間或標籤或其他東西。

我修改地址manualy後(我刪除了所有字符串,我又寫了),問題就解決了,但我有〜6000倍的值,所以這不是一個解決方案:)

有什麼可以的問題?

我想,字符串可以有一些「空字符」,但如何檢測並刪除它?

謝謝

P.S. 問題不只是長度。我需要與其他人一起加入此表,並使用檢查字段「地址」中的值是否等於的條件。即使字段具有相同的排序規則並且表具有相同的排序規則,查詢返回沒有地址匹配的條件

例如,

對於查詢:

SELECT p.address,char_length(p.address) , r.address, char_length(r.address) 
FROM `pagesjaunes_test` p 
LEFT JOIN restaurants r on p.name=r.name 
WHERE 
p.postal_code=r.postal_code 
and p.address!=r.address 
and p.phone='' 
and p.cuisines='' 
LIMIT 10 

所以: p.address = r.address

結果是:

 
+-------------------------------------+------------------------+--------------------------+------------------------+ 
| address        | char_length(p.address) | address     | char_length(r.address) | 
+-------------------------------------+------------------------+--------------------------+------------------------+ 
| Dupin Marc13 quai Grands Augustins |      34 | 13 quai Grands Augustins |      24 | 
| 39 r Montpensier     |      16 | 39 r Montpensier   |      16 | 
| 8 r Lord Byron      |      14 | 3 r Balzac    |      10 | 
| 162 r Vaugirard      |      15 | 162 r Vaugirard   |      15 | 
| 32 r Goutte d'Or     |      16 | 32 r Goutte d'Or   |      16 | 
| 2 r Casimir Périer     |      18 | 2 r Casimir Périer  |      18 | 
| 20 r Saussier Leroy     |      19 | 20 r Saussier Leroy  |      19 | 
| Senes Douglas22 r Greneta   |      25 | 22 r Greneta    |      12 | 
| Ngov Ly Mey44 r Tolbiac    |      23 | 44 r Tolbiac    |      12 | 
| 33 r N-D de Nazareth    |      20 | 33 r N-D de Nazareth  |      20 | 
+-------------------------------------+------------------------+--------------------------+------------------------+ 

正如你看到的,「162 [R Vaugirard「,」20 Saussier Leroy「只包含ASCII字符,長度相同,但不等於!

回答

3

也許看看mysql文本字段的編碼 - UTF8使用2個字節對​​其大部分字符進行編碼 - 只有UTF8的一小部分(例如ASCII字符)被編碼爲一個字節。

MySQL知道UTF8並計數正確。 PHP文本函數不支持UTF8,並且自己計算字節數。

因此,如果PHP計數超過MYSQL,這可能是原因,你可以看看utf8decode。

br從薩爾茨堡!

+0

問題不只是長度。我需要與其他人一起加入此表,並使用檢查字段「地址」中的值是否等於的條件。即使字段具有相同的排序規則並且表具有相同的排序規則,但查詢返回的地址不匹配 – Ruslan 2012-04-13 09:39:13

1

official documentation說:

返回字符串str的長度,以字節爲單位來測量。多字節字符計爲多個字節。這意味着,對於含有五兩字節字符,length()返回10,而CHAR_LENGTH()返回5

因此,使用CHAR_LENGTH代替:)

select id, address from pagesjaunes_test 
where address = substr(address, 1, char_length(address) - 1) 
+0

謝謝。是的,這是正確的功能,但這仍然不能解決我所有的問題 – Ruslan 2012-04-13 10:04:56

0

最後一個字符串,我發現問題。將排序規則更改爲ascii_general_ci後,所有非ASCII字符都轉換爲「?」。有些空間也被替換爲「?」。在檢查初始值之後,MySQL的函數ORD()返回160(而不是32)這些空格。所以,

UPDATE pagesjaunes_test SET address = TRIM(REPLACE(REPLACE(address, CHAR(160), ' '), ' ',' ') 

解決了我的問題。