SQL Server 在运行查询之前更改了我的字符串

Posted

技术标签:

【中文标题】SQL Server 在运行查询之前更改了我的字符串【英文标题】:SQL Server changed my strings before running the query 【发布时间】:2013-03-29 12:26:46 【问题描述】:

我尝试选择一些包含特殊字符的特殊记录,但 字符。

例如:

    DECLARE @param NVARCHAR(30)

    SET @param=N'¤÷þ'--this is my special string that i want to be searched exactly.

    DECLARE @TSQL varchar(8000)
    SET @TSQL = 'SELECT * FROM MyTable WHERE MyFieldName LIKE %' + @param + '% '

    PRINT @TSQL

    --EXECUTE (@TSQL)

但在结果(打印)中我看到了:

SELECT * FROM MyTable WHERE MyFieldName LIKE '%¤÷þ?%'

当您看到字符串的某些部分转换为 (?) 字符时,此问题导致我的 SELECT 命令返回空值。

我尝试更改运行查询的数据库的排序规则:

SQL_Latin1_General_CP1_CI_AS

它适用于一些特殊的字符串,但它也不支持我的所有字符串。 所以,问题来了:我怎样才能告诉 SQL Server,请不要更改我的字符串 ascii 代码? 有没有办法(或任何排序规则)说 SQL Server 看到的字符串与现实中的字符串完全一样?

PS:我使用的是 SQL Server 2008 R2。

【问题讨论】:

MyFieldName有什么类型?更改数据库排序规则对现有列没有任何作用,仅供参考。 好吧,@TSQLvarchar(8000) 天哪!只有我的部分代码被复制(我从没想过)。谢谢老兄。 【参考方案1】:
DECLARE @TSQL varchar(8000)

varchar(8000) 不能代表¤÷þ。继续用@param 做你正在做的事情;使用基于 NVARCHAR 的东西。

正如usr 正确指出的那样,您确实应该使用sp_executesql 及其指定参数的能力。来自文档:

DECLARE @IntVariable int;
DECLARE @SQLString nvarchar(500);
DECLARE @ParmDefinition nvarchar(500);

/* Build the SQL string one time.*/
SET @SQLString =
     N'SELECT BusinessEntityID, NationalIDNumber, JobTitle, LoginID
       FROM AdventureWorks2012.HumanResources.Employee 
       WHERE BusinessEntityID = @BusinessEntityID';
SET @ParmDefinition = N'@BusinessEntityID tinyint';
/* Execute the string with the first parameter value. */
SET @IntVariable = 197;
EXECUTE sp_executesql @SQLString, @ParmDefinition,
                      @BusinessEntityID = @IntVariable;

【讨论】:

另外,不要做 SQL 连接的事情。使用带有sp_executesql 的参数。【参考方案2】:

如果您有需要保留的特殊字符,请使用NVARCHAR 类型的Unicode 字符串而不是VARCHAR - 就这么简单.....

DECLARE @param NVARCHAR(30)
SET @param = N'¤÷þ'--this is my special string that i want to be searched exactly.

DECLARE @TSQL NVARCHAR(4000)    -- <=== use NVARCHAR here
SET @TSQL = N'SELECT * FROM MyTable WHERE MyFieldName LIKE %' + @param + N'% '

PRINT @TSQL

那么你的特殊字符将被保留如输入的那样......

正如其他人所指出的:像这样将您的 SQL 语句连接在一起绝不是一个好主意 - 它会使您的代码面临潜在的 SQL 注入攻击。您应该使用参数化查询和sp_executesql,它允许您为查询定义和提供参数。

【讨论】:

感谢您的简单回答以及安全提示。 (这是我的代码的一部分,仅用于测试目的,所以我将在上一个版本中使用参数变量更改命令。)

以上是关于SQL Server 在运行查询之前更改了我的字符串的主要内容,如果未能解决你的问题,请参考以下文章

通过消除视图简化 SQL Server 查询

如何在 PL-SQL 上更改之前获取视图/触发器?

查询在 SQL Server 上运行,但不使用 PHP

更改 SQL Server DB 中列的数据类型时出错 - Java

如何在 SQL Server 中将函数设置为默认值?

在提交之前更改 Oracle SQL 查询文本 [关闭]