2015-09-16 24 views
2

我一直在試圖圍繞一個可能的隱藏價值。關於隱藏字符的MYSQL查詢失敗?

每當我運行此查詢

SELECT * FROM LIST WHERE `GROUP_2` = "Yes"; 

我得到0的結果。

每當我運行此:

SELECT * FROM LIST WHERE `GROUP_2` LIKE 'Yes%'; 

我能夠拉動的結果。

我已經嘗試了很多不同的導出和導入參數使用MySQL加載數據爲CSV導入,但沒有任何工作。 GROUP_1和GROUP_2都設置爲varchar(55)

任何查詢我可以運行以確定這個原因或檢測隱藏breaklines?

ID name GROUP_1 GROUP_2 
1 Bob  No  Yes 
2 Jim  Yes  No 

回答

1

我從來沒有嘗試過自己,但認爲這將識別具有'隱形'字符的任何行。

SELECT * 
FROM theTable 
WHERE field REGEXP '[^[:graph:] ]+' --This allows spaces, even leading/trailing ones 
OR field <> TRIM(field) --This catches those spaces 
; 

它不能識別或修復違規字符,只是在該字段中包含它們的行。

+0

你只是在幫助確認每一個條目從GROUP_2有一些隱藏 – renfley

+0

這可能是乏味的,這取決於多種在這一領域中的數據,但你可以開始確定他們用mysql字符串函數,如ASCII()和SUBSTR()。當確定時,您可以添加最少的REPLACE(REPLACE(field,CHAR(x),''),CHAR(y),'')AS字段的表達式來修復數據。 https://dev.mysql.com/doc/refman/5.1/en/string-functions.html – Uueerdo

2

要確定是什麼問題,你可以使用HEX功能:

SELECT group_1, HEX(group_1) 
FROM table 
WHERE group_1 LIKE 'Yes%' AND group_1!='Yes' 

是應該被編碼爲596573(取決於代碼集使用的可能是不同的),但之後你會看到一些其他字符。

編輯

我建議你找到問題的根源並解決文本文件或導入過程。但是,如果您想要修復現有數據而不進行新導入,則有多個選項。

您可以按照xQbert鏈接(感謝您的鏈接!):

update table SET group_2 = TRIM(TRAILING '\n' FROM group_2); 

或修復自己的查詢:

UPDATE TABLE set GROUP_2 = replace(replace(GROUP_2,'\n',''), '\r', ''); 

,或者如果你只有是/否值:

UPDATE TABLE set GROUP_2='Yes' WHERE group_2 LIKE 'Yes%' AND group_2!='Yes'; 
UPDATE TABLE set GROUP_2='No' WHERE group_2 LIKE 'No%' AND group_2!='No'; 
+0

Yupper 5965730D – renfley

+0

@renfley這是一個隱藏的回車;) – fthiella

+0

這是,看着源嘗試和識別添加字段。 – renfley

0

嘿傢伙巨大的感謝大家。

@Uueerdo,@fthiella,@Rahul,

我原先的問題是由所述源數據的原因以及我用於導入文件的方法。

每當我直接查詢使用相等,我wouldnt返回一個值,當使用喜歡「是%」這將。

通過以下:

SELECT GROUP_2, HEX(GROUP_2) 
FROM QUEUE 
WHERE GROUP_2 LIKE 'Yes%'; 

這有助於確定的新增0D十六進制是回車這會導致查詢失敗。

的快速修復,這是利用如下因素來更新字段..

UPDATE QUEUE set GROUP_2 = replace(GROUP_2,'\r',''); 

但由於這將是每一個需要的數據更新時,我發現了托架能夠在被確定原始的LOAD DATA。所使用的原始語法是:

LINES TERMINATED BY '\n' 

然後我改爲

LINES TERMINATED BY '\r' 

這允許源數據保持不變。

感謝 再次:)