更新查询会损坏字符

时间:2019-05-27 14:37:05

标签: sql sql-server sql-server-2008 collation

我的sql更新正常工作,但它更改了土耳其字符。更新查询将诸如ı之类的土耳其字符更改为i等。这是我的查询:

set @updstatement = 'UPDATE ' + @table_name + ' SET ' + @text_col + '= ''' + @newText + ''' WHERE ' + @id_col + '= ''' + @cur_Id + '''';
                PRINT @updstatement
                exec sp_executesql @updstatement 
                PRINT 'Updated: ' + @cur_Id;

我尝试了COLLATE DATABASE_DEFAULTCOLLATE TURKISH_CI_AS选项,但没有任何变化。列的数据类型为ntext。表数据库的整理设置为Latin1_General_CI_AS。表的整理设置为Latin1_General_CI_AS。列的整理设置为Latin1_General_CI_AS。在更新之前,我可以看到土耳其字符已正确存储在表的列中。更新后,列的查询数据已损坏。你有什么主意吗?

1 个答案:

答案 0 :(得分:1)

就像我在评论中说的那样,不要将原始值注入动态SQL语句中。这是一个很大的SQL注入问题,没有理由这样做。

我怀疑您使用的是varchar,并且结合使用非参数化语句会导致此问题。如果这样做不能解决问题,则需要提供一个示例来复制问题(注意猜测的数据类型):

DECLARE @table_name sysname,
        @textcol sysname,
        @newtext nvarchar(50), --Guessed datatype
        @id_col sysname,
        @cur_id int; --Guessed dataytpe

DECLARE @updstatement nvarchar(MAX);
SET @updstatement = 'UPDATE ' + QUOTENAME(@table_name) + N' SET ' + QUOTENAME(@text_col) + N' = @newtext WHERE ' + QUOTENAME(@id_col) + N' = @cur_id;';
PRINT @updstatement; --Your debugging friend
EXEC sp_executesql @SQL, N'@newtext nvarchar(50), @cur_id int', @newtext = @newtext, @cur_id = @cur_id;