如何查询记录包含SQL Server 2008中的双字节字符

时间:2011-06-14 08:51:30

标签: sql sql-server-2008

在SqlServer中,我们有1个表 - 产品。它的一些记录包含双字节字符(如中文)和单字节字符(如英语)。问题是如何查询包含双字节字符的记录。非常感谢你。

3 个答案:

答案 0 :(得分:6)

根据我对这个问题的理解,假设你有一个正在查看的NVARCHAR列,你可以试试这个例子:

DECLARE @Data TABLE (Field1 NVARCHAR(100))
INSERT @Data VALUES ('ABC')
INSERT @Data VALUES ('123')
INSERT @Data VALUES (N'Value with 化ける unicode chars in')

SELECT * FROM @Data WHERE Field1 <> CAST(Field1 AS VARCHAR(100))

因此,这将返回VARCHAR(非unicode)表示与NVARCHAR值不匹配的所有记录 - 例如如果值包含unicode字符,则VARCHAR表示将不匹配,因此将返回行

答案 1 :(得分:3)

  1. 该列的类型应为 nvarchar ,而不是 varchar (或者为char的nchar)
  2. 您应该在包含此类字符的搜索字符串的开头使用N'。 N'TestćšString'
  3. 在后面的代码中使用nvacrahr作为参数类型。
  4. 示例查询

    SELECT * FROM Product WHERE YourColumnName = N'TestćšString'
    

    检查以下陈述之间的区别。

    DECLARE @Data TABLE (Field1 NVARCHAR(100))
    INSERT @Data VALUES ('ABC')
    INSERT @Data VALUES ('123')
    INSERT @Data VALUES (N'Value with 化ける unicode chars in')
    
    SELECT * FROM @Data WHERE Field1  = N'Value with 化ける unicode chars in'
    
    
    
    DECLARE @Data TABLE (Field1 NVARCHAR(100))
    INSERT @Data VALUES ('ABC')
    INSERT @Data VALUES ('123')
    INSERT @Data VALUES (N'Value with 化ける unicode chars in')
    
    SELECT * FROM @Data WHERE Field1  = 'Value with 化ける unicode chars in'
    

答案 2 :(得分:0)

您可以使用此功能识别非ASCII文本。它的工作原理是因为纯ASCII是泰语,日语,希伯来语和代码之间的唯一重叠。

CREATE FUNCTION dbo.IsAscii(@text nvarchar(max))
    RETURNS bit
AS
BEGIN
    RETURN 
        CASE WHEN EXISTS
            (
                SELECT CAST(@text AS varbinary(max)) [bin]
                INTERSECT
                SELECT CAST(CAST(CAST(@text COLLATE Hebrew_BIN
                    AS varchar(max)) AS nvarchar(max)) AS varbinary(max))
                INTERSECT
                SELECT CAST(CAST(CAST(@text COLLATE Thai_BIN2
                    AS varchar(max)) AS nvarchar(max)) AS varbinary(max))
                INTERSECT
                SELECT CAST(CAST(CAST(@text COLLATE Japanese_BIN2
                    AS varchar(max)) AS nvarchar(max)) AS varbinary(max))
                INTERSECT
                SELECT CAST(CAST(CAST(@text collate SQL_Latin1_General_CP437_BIN2
                    AS varchar(max)) AS nvarchar(max)) AS varbinary(max))
            )
            THEN 1
            ELSE 0
        END
END
GO