在SqlServer中,我们有1个表 - 产品。它的一些记录包含双字节字符(如中文)和单字节字符(如英语)。问题是如何查询包含双字节字符的记录。非常感谢你。
答案 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)
N'
。 N'TestćšString'示例查询
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