MSSQL поиск юникод-символов с помощью оператора LIKE - PullRequest
0 голосов
/ 23 мая 2018

У меня есть хранимая процедура, в которой я передаю параметр, который является Unicode и выглядит следующим образом:

מוכר שמן קוקוס בכחל מיני ואריציות

Теперь проблема заключается в том, что, когда я ввожу что-то в форму, чтобы найти это значение в мтаблица, такая как fllowing:

IF LEN(@SearchValue) > 0
        BEGIN
                SET @WhereQuery = @WhereQuery +

                 '(Type='  + CAST(@type AS NVARCHAR(10)) + ' and UserId=' + CAST(@userid AS NVARCHAR(10)) + ') and'
                 + '(convert(nvarchar(max),SentWord) like ''%' + @SearchValue  + '%''  or '
                + 'convert(nvarchar(max),Comment) like ''%' + @SearchValue  + '%'')'
        END

Где @SearchValue определяется как nvarchar (200) в SQL-сервере, и столбцы таблицы, которые содержат определенное значение:

SentWord и Comment, и оба определены в Юникодекак nvarchar (600).

Что я здесь не так делаю?Почему поиск по MSSQL не может проводиться по-еврейски?Кто-нибудь может мне помочь?

Как сказал @Jeroen, возможное исправление - добавить N после оператора LIKE, как показано ниже:

  IF LEN(@SearchValue) > 0
            BEGIN
                    SET @WhereQuery = @WhereQuery +

                     '(Type='  + CAST(@type AS NVARCHAR(10)) + ' and UserId=' + CAST(@userid AS NVARCHAR(10)) + ') and'
                     + '(convert(nvarchar(max),SentWord) like N''%' + @SearchValue  + '%''  or '
                    + 'convert(nvarchar(max),Comment) like N''%' + @SearchValue  + '%'')'
            END

Но это все равно не работает ...

1 Ответ

0 голосов
/ 23 мая 2018

Не объединяйте свои строки таким образом !!!Это инъекционный кошмар!

Далее, вы объявляете свою буквальную строку в кодировке Unicode как varchar, а не nvarchar.если вы попытаетесь SELECT 'מוכר שמן קוקוס בכחל מיני ואריציות';, обратите внимание, что возвращаемое значение равно '???? ??? ????? ???? ???? ????????'.Вам нужно поставить перед ним префикс N, таким образом: SELECT N'מוכר שמן קוקוס בכחל מיני ואריציות';.

Теперь важно параметризовать этот SQL ... К сожалению, у меня недостаточно SQL, чтобы фактически сделать это полностью длявы, так что вот другой пример:

DECLARE @SQL nvarchar(MAX);
DECLARE @string nvarchar(20) = N'Test';

SET @SQL = 'SELECT * FROM MyTable WHERE MyColumn = @dString;'; --Notice the variable in the dynamic SQL

PRINT @SQL;
EXEC sp_executesql @SQL, N'dString nvarchar(20)',@dString = @string; --Notice the variable declaration and assignment.
...