Как запросить записи, содержащие двухбайтовые символы в SQL Server 2008 - PullRequest
2 голосов
/ 14 июня 2011

В SqlServer у нас есть 1 таблица - Продукт.Некоторые из его записей содержат как двухбайтовые символы (например, китайский), так и однобайтовые символы (например, английский).Вопрос в том, как запросить те записи, которые содержат двухбайтовые символы.Большое спасибо.

Ответы [ 3 ]

6 голосов
/ 14 июня 2011

Исходя из моего понимания вопроса, предполагая, что у вас есть столбец 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 не будет соответствовать и, следовательно, вернет строку

3 голосов
/ 14 июня 2011
  1. Столбец должен иметь тип nvarchar , а не varchar (или nchar для символа)
  2. Вы должны использовать N' в начале строки поиска, содержащей такие символы. N'TestćšString '
  3. В коде позади используйте nvacrahr в качестве типа параметра.

Пример запроса

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'
0 голосов
/ 14 июня 2011

Вы можете использовать эту функцию для идентификации текста не-ASCII.Это работает, потому что чистый ASCII является единственным совпадением между тайским, японским, ивритом и кодовой страницей 437.

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...