2013-03-02 30 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