2013-01-24 58 views
0
Select Name from tblAnimal where Id=1 

返回:我的寵物Where子句不SQL工作,因爲空格字符的

Select Id from tblAnimal where Name='My Pet' --I copy/pasted this value in SSMS! 

返回空變更

一些研究,我發現,它可以是後(爲什麼?) Char(10)和Char(13)。那麼,我猜,當我複製粘貼我的寵物時,它會自動將Char(10)轉換爲Space for Windows環境?

正因爲如此:

Select id from tblAnimal where Name like '%My%' 

返回1 雖然

select id from Animal where Name like '%My %' 

回報什麼。

問題。
1.爲什麼會發生這種情況?
2.如何解決這個問題(生產數據庫,數百萬條記錄)
3.如何防止這種情況發生?

+0

您可以使用'_'作爲通配符。 'LIKE'%My_Pet%'' – Kermit

+0

@njk,感謝您的建議,但這不是我的解決方案,因爲我不控制'我的寵物'搜索字符串。它來自用戶。我只是希望SQL服務器正常運行並對待所有特殊空間,如普通空間 – user194076

+0

Chars 10/13是一個回車/換行符。這位用戶如何在他們的字符串中輸入?或者你的意思是說這些值存儲在記錄中? –

回答

1

char 10和char 13是換行符和回車 - 它們不是空格,即使它們在網格結果中顯示爲這樣。如果您在SSMS中查看結果,最好告訴它將結果視爲文本(ctrl + T或在工具欄上)。如果你這樣做,你會看到,如果結果真的:

My Pet 

或者

My 
Pet 

結果網格將顯示它作爲My Pet在同一行,因爲這是電網是如何工作的。作爲文本的結果將顯示新行,即使對於單個記錄,也可以更好地查看錶中的數據。

+0

@ user194076如果它將結果分成兩行,那麼問題是被嵌入到表中的列中,因此用戶將不會搜索該結果,直到您更改數據,即轉換它從到一個空間)。 –

+0

感謝您的回覆,您說得對。只要使用文本模式,它看起來像兩行。 – user194076

+0

@MichaelTodd,你們知道,如果列上有一個設置可以防止Char(10)或Char(13),或者它應該是一個自定義觸發器? – user194076

6

要清理的數據,用空格替換CR/LF對:

UPDATE dbo.table 
    SET column = REPLACE(REPLACE(column, CHAR(10), ''), CHAR(13), ' ') 
    WHERE CHARINDEX(CHAR(10), column) + CHARINDEX(CHAR(13), column) > 0; 

並解決了點約防止這個數據擺在首位,你肯定能防止這就是預防應該開始的地方 - 儘可能接近數據,因爲對於人們可以將垃圾填入表格的所有外部方式的控制力較弱。假設你有一個表已:

CREATE TABLE dbo.blat(col VARCHAR(32)); 

要添加一個約束是簡單的:

ALTER TABLE dbo.blat ADD CONSTRAINT ck_col_NoCRLF 
    CHECK(CHARINDEX(CHAR(10), col) + CHARINDEX(CHAR(13), col) = 0); 

現在:

INSERT dbo.blat(col) SELECT NULL; 

作品。

INSERT dbo.blat(col) SELECT 'howdy'; 

工程。

INSERT dbo.blat(col) SELECT 'howdy 
    partner'; 

與失敗:

消息547,級別16,狀態0,第1行
INSERT語句衝突與CHECK約束 「ck_col_NoCRLF」。衝突發生在數據庫「test」,表「dbo.blat」,列「col」中。
該聲明已被終止。

你也可以考慮加入各種其他特殊字符 - CHAR(9)標籤)是一種常見的爲好。