gpt4 book ai didi

sql-server - 将 UTF8 字符串插入 SQL Server 2008 表时出现 SQL 错误

转载 作者:行者123 更新时间:2023-12-03 19:42:06 25 4
gpt4 key购买 nike

我在尝试使用 Zeosdb native SQL Server 库从我的 Delphi 7 应用程序将包含 UTF-8 编码的中文字符和标点符号的字符串插入 SQL Server 2008 表(默认安装)时遇到问题。

我记得过去我在使用 PHP 和其他方法将 UTF8 字符串插入 SQL Server 时遇到问题,所以我相信这个问题不是 Zeosdb 独有的。

它不会一直发生,一些 UTF8 编码的字符串可以成功插入,但有些不能。我无法弄清楚导致失败的字符串中的内容。

表架构:

CREATE TABLE [dbo].[incominglog](
[number] [varchar](50) NULL,
[keyword] [varchar](1000) NULL,
[message] [varchar](1000) NULL,
[messagepart1] [varchar](1000) NULL,
[datetime] [varchar](50) NULL,
[recipient] [varchar](50) NULL
) ON [PRIMARY]

SQL 语句模板:
INSERT INTO INCOMINGLOG ([Number], [Keyword], [Message], [MessagePart1], [Datetime], [Recipient]) 
VALUES('{N}', '{KEYWORD}', '{M}', '{M1}', '{TIMESTAMP}', '{NAME}')

参数 {KEYWORD} , {M}{M1}可以包含 UTF8 字符串。

例如,以下语句将返回错误:

Incorrect syntax near 'é¢'. Unclosed quotation mark after the character string '全力克æœå››ç§å±é™©','2013-06-19 17:07:28','')'.


INSERT INTO INCOMINGLOG ([Number], [Keyword], [Message], [MessagePart1], [Datetime], [Recipient]) 
VALUES('+6590621005', '题', '题 [全力克æœå››ç§å±é™© åšå†³æ‰«é™¤ä½œé£Žä¹‹å¼Š]', '[全力克æœå››ç§å±é™©','2013-06-19 17:07:28', '')

注意:请忽略实际字符,因为 utf8 编码在复制和粘贴后丢失。

我也试过使用 NVARCHAR而不是 VARCHAR :
CREATE TABLE [dbo].[incominglog](
[number] [varchar](50) NULL,
[keyword] [nvarchar](max) NULL,
[message] [nvarchar](max) NULL,
[messagepart1] [nvarchar](max) NULL,
[datetime] [varchar](50) NULL,
[recipient] [varchar](50) NULL
) ON [PRIMARY]

并尝试将 SQL 语句修改为:
INSERT INTO INCOMINGLOG ([Number],[Keyword],[Message],[MessagePart1],[Datetime],[Recipient]) VALUES('{N}',N'{KEYWORD}',N'{M}',N'{M1}','{TIMESTAMP}','{NAME}')

他们也不工作。我将不胜感激任何指针。谢谢。

EDITED: As indicated by marc_s below, the N prefix must be outside the single quotes. It is correct in my actual test, the initial statement is a typo, which I've corrected.



带有 N 前缀的测试也返回了错误:

Incorrect syntax near '原标é¢'. Unclosed quotation mark after the character string '全力克æœ?å››ç§?å?±é™©','2013-06-19 21:22:08','')'.



SQL 语句:
INSERT INTO INCOMINGLOG ([Number],[Keyword],[Message],[MessagePart1],[Datetime],[Recipient]) VALUES('+6590621005',N'原标题',N'原标题 [全力克�四��险 �决扫除作风之弊]',N'[全力克�四��险','2013-06-19','')

.
.

REPLY TO gbn's Answer: I've tried using parameterized SQL but still encountering "Unclosed quotation mark after the character string" error.



对于新测试,我使用了简化的 SQL 语句:
INSERT INTO INCOMINGLOG ([Keyword],[Message]) VALUES(:KEYWORD,:M)

上述语句返回的错误:

Incorrect syntax near '原标é¢'. Unclosed quotation mark after the character string '')'.



对于信息,KEYWORD 和 M 的值是:

KEYWORD:原标题

M:原标题 [



.
.
.

Further tests on 20th June Parametarized SQL query don't work so I tried a different approach by trying to isolate the character that caused the error. After trial and error, I managed to identify the problematic character.



以下字符产生错误:é¢~

SQL 语句: INSERT INTO INCOMINGLOG ([Keyword]) VALUES('题')
有趣的是,请注意返回错误税中的字符串包含一个“?”原始语句中不存在的字符。

Error: Unclosed quotation mark after the character string '�)'. Incorrect syntax near '�)'.



如果我在罪魁祸首之后立即放置一些拉丁字符,就不会出错。例如, INSERT INTO INCOMINGLOG ([Keyword]) VALUES('题Ok')工作正常。注意:它不适用于所有字符。

最佳答案

' UTF-8 中异常终止 SQL 的字符。

经典的 SQL 注入(inject)。

使用适当的参数化,基本上不是字符串连接。

编辑,在问题更新后...

如果没有 Delphi 代码,我认为我们无法为您提供帮助
所有 SQL 端代码都有效。例如,这适用于 SSMS

DECLARE @t TABLE ([Keyword] nvarchar(100) COLLATE Chinese_PRC_CI_AS);
INSERT INTO @t ([Keyword]) VALUES('题');
INSERT INTO @t ([Keyword]) VALUES(N'题');
SELECT * FROM @t T;

缺少一些东西来帮助我们解决这个问题

另见
  • How to store UTF-8 bytes from a C# String in a SQL Server 2000 TEXT column
  • Having trouble with UTF-8 storing in NVarChar in SQL Server 2008
  • Write utf-8 to a sql server Text field using ADO.Net and maintain the UTF-8 bytes
  • 关于sql-server - 将 UTF8 字符串插入 SQL Server 2008 表时出现 SQL 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17189288/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com