MSSQL使用LIKE运算符搜索unicode characthers

时间:2018-05-23 09:46:19

标签: sql sql-server sql-server-2008 unicode where-clause

我有一个存储过程,我传递一个unicode参数,如下所示:

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

现在的问题是,当我在表单中输入一些内容来搜索m表中的这个值时,就像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在SQL Server中定义为nvarchar(200),并且包含特定值的表列为:

SentWord和Comment都是unicode,定义为nvarchar(600)。

我在这里做错了什么?为什么不能通过希伯来字符来搜索MSSQL?有人可以帮助我吗?

正如@Jeroen所说,可能的修复方法是在LIKE运算符之后添加N,如下所示:

  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 :(得分:1)

不要那样连接你的字符串!这是一场注射噩梦!

接下来,您将文字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.