2011-03-03 37 views
3

我遇到了我正在处理的项目中的问题:特定SQL Server 2008表列中的某些字符串值包含Unicode字符。例如,而不是破折号,某些字符串将包含EM DASH(http://www.fileformat.info/info/unicode/char/2014/index.htm)。查询SQL Server 2008表以在包含Unicode字符的列中查找值

当我向第三方服务器发送HTTP请求时,包含Unicode字符的列值会导致问题。有没有办法查询哪些行包含一个或多个Unicode字符,所以我至少可以开始确定需要修复多少行?

+1

那么如果你的数据类型是unicode,那么所有的字符将是Unicode。您是否想要在默认排序规则中找到所有无法在单个字节中跳转的值,而不会丢失数据? – 2011-03-03 17:54:51

+0

我认为单字节项目可能仍然包含我不关心的隐形控制字符。如果说我想查找包含一个或多个ASCII字符32-126之外的字符的所有字符串,那就更准确了。 – 2011-03-09 19:47:47

回答

17

您想要查找包含ASCII字符32-126之外的一个或多个字符的所有字符串。

我认为这应该做的工作。

SELECT * 
FROM your_table 
WHERE your_column LIKE N'%[^ -~]%' collate Latin1_General_BIN 
+0

完美 - 这正是我需要的。非常感谢! – 2011-03-10 04:58:23

+0

不错的解决方案+1 – MSTdev 2016-11-03 13:48:12

2

您可以执行此操作的一种方法是,在转换为不支持unicode的数据类型时,查看哪些行不再相同。

CREATE TABLE myStrings (
    string nvarchar(max) not null 
) 

INSERT INTO myStrings (string) 
SELECT 'This is not unicode' union all 
SELECT 'This has '+nchar(500)+' unicode' union all 
SELECT 'This also does not have unicode' union all 
SELECT 'This has lots of unicode '+nchar(600)+nchar(700)+nchar(800)+'!' 

SELECT cast(string as varchar) 
FROM myStrings 

SELECT * 
FROM myStrings 
WHERE cast(cast(string as varchar(max)) as nvarchar(max)) <> string 
+0

你的结果是什么样的?我尝试了类似的东西,但失败了。我认为这与DASH和HYPHEN有关。 – Richard 2017-03-23 19:34:44

-1
SELECT * 
FROM your_table 
WHERE your_column LIKE N'%[^ -~]%' collate Latin1_General_BIN 

发现包含ASCII字符32-126内的一个或多个字符的所有字符串。

我认为目的是找到ASCII字符不在32-126范围内的字符串?

LIKE不可能。这不工作吗?

SELECT * 
FROM your_table 
WHERE your_column NOT LIKE N'%[^ -~]%' 

不需要整理。