2013-03-02 25 views
0

我希望能夠使用LINQ to Entities識別保存在我的sql服務器中的字符串中存在問題的字符。識別字符串中存在問題的字符

有問題的字符是在編碼過程中有問題的字符。

這是一個問題字符串的例子:「testing stringáאç」。

在上面的例子中,只有 字符被認爲是有問題的。

因此,例如下面的字符串不被視爲有問題:「testingstringáאç」。 如何檢查此Varchar並確定其中存在有問題的字符?

請注意,我的首選解決方案是通過LINQ來識別實體查詢,但也歡迎其他解決方案 - 例如:某些存儲過程可能是?

我試着用正則表達式,並一起玩「LIKE」語句,但沒有成功...

+0

不會更好的方式來處理,通過避免加重數據庫問題的字符串?我的意思是,設置正確的字符編碼(例如'utf-8')。 – 2013-03-02 15:41:00

+0

基本上你是對的,但注意在我的情況下可能會有幾種情況導致這類有問題的字符。我的目標是建立一些錯誤通知器,通知這些錯誤以進一步調查和處理。 – 2013-03-02 15:50:09

+0

Unicode!=「有問題的字符」。數據庫和您選擇的語言都支持它,您可能也想要。 – JerKimball 2013-03-02 15:50:27

回答

1

.Net和NVARCHAR都使用Unicode,所以沒有內在的「問題」(至少不是BMP字符)。

所以,你首先要確定的意思意思「有問題」:

  • 字符不會在目標映射代碼頁

編碼之間簡單地轉換,並檢查數據是否丟失:

CONVERT(NVARCHAR, CONVERT(VARCHAR, @originalNVarchar)) = @originalNVarchar 

請注意,您可以使用COLLATE子句使用SQL Server排序規則,而不使用默認數據庫排序規則。

  • 字符不能顯示因使用的字體

這不能在.net中輕鬆完成

+0

不錯,這是有效的!謝謝! – 2013-03-03 08:47:32

2

退房the Encoding class

它有一個DecoderFallback PropertyEncoderFallback Property,它可以讓你檢測和替換解碼期間發現的壞字符。

+0

您所描述的解決方案在實體框架方面有點問題。下面@devio建議的解決方案在SQL服務器端工作 - 但是服務於我的目標。再次感謝! – 2013-03-03 08:52:22

1

你可以做這樣的事情:

DECLARE @StringWithProblem NVARCHAR(20) = N'This is '+NCHAR(8)+N'roblematic'; 
DECLARE @ProblemChars NVARCHAR(4000) = N'%['+NCHAR(0)+NCHAR(1)+NCHAR(8)+']%'; --list all problematic characters here, wrapped in %[]% 

SELECT PATINDEX(@ProblemChars, @StringWithProblem), @StringWithProblem; 

也就是說如果沒有找到給你的第一個問題的字符或0的指數。

+0

我理解你的解決方案,它可能會工作,但我想找到更通用的解決方案 - 就像@devio上面提供的解決方案。謝謝 – 2013-03-03 08:50:51