无法将特定字符串写入 mssql 数据库

Posted

技术标签:

【中文标题】无法将特定字符串写入 mssql 数据库【英文标题】:Cannot write a specific string into a mssql database 【发布时间】:2015-07-08 11:13:36 【问题描述】:

我对数据库和 python 很陌生。我用我的脚本读取了许多日志文件,并将数据写入 MSSql Express 数据库并使用 pymssql。日志文件为 .csv 格式,如下所示:

ID;请求 3gix2v2h2mjmmybrf4p5blbm;49db032f0a144efeb1e0e690b4e6a26f; kzbcaakb2ex44dnhrqi4kgvt;28042afb61b44c539fbaa1ac4c303665;

ID 和 REQUEST 在数据库中定义为 VARCHAR(50)。

我的脚本运行良好,我在数据库中写入了大约 70000 个条目,直到其中一个日志文件中包含以下值的行:

0xaf3azaza5sb1ztogqfdmwb;934d4978a40c451b8f4080791f752453

出现。我得到错误:

pymssql.ProgrammingError:(102,“'zaza5sb1ztogqfdmwb'.DB-Lib 错误消息 20018 附近的语法不正确,严重性 15)

这是我的脚本:

for filename in os.listdir(sFolderlocation):
    if "archive" in  filename:            
        with open(sFolderlocation + os.sep + filename, 'r') as f:
            reader = csv.reader(f,delimiter=';')
            skipfirstline = True
            for row in reader:
                werte=[]
                if skipfirstline:
                    skipfirstline = False
                    continue
                werte.append(row[0])    #ID
                werte.append(row[1])    #maprequest
                werte=tuple(werte)                    
                cursor.execute(
                    "INSERT INTO webgis_test (SESSIONID,MAPREQUESTID) VALUES (%s, %s)",
                    werte)
                conn.commit()

“0xaf3a”是否以某种方式被解释为十六进制,所以我得到了错误?你能帮我解决这个问题吗?谢谢你的帮助

当其他人在代码中看到我可以做得更好的东西时,我真的很想听听你的建议:)

【问题讨论】:

好吧,它似乎在; 失败了。我对 python 不熟悉,所以我真的不能说 - 但你是否正确地参数化了你的参数? 该错误表明正在传递的值是一个没有用引号括起来的文字。前导 '0x' 产生一个十六进制文字。因为我不是 Python 人,所以我无法说出最好的补救措施。准备好的查询肯定会避免这个问题。 @DanGuzman 非常感谢,这解决了我的问题! 【参考方案1】:

感谢丹·古兹曼。文字没有用引号括起来。

此 python 代码有效:

cursor.execute(
"INSERT INTO webgis_test2 (SESSIONID, MAPREQUESTID) VALUES ('"+werte[0]+"','"+werte[1]+"');")

【讨论】:

只想补充一点,唯一需要用引号括起来的文字是字符串、日期/时间和 xml。整数和数字文字不应括在引号中。【参考方案2】:

在 MSSQL 中,VARCHAR 字段用于存储非 unicode 数据。 CSV 文件中似乎存在 MSSQL 无法存储在 VARCHAR 字段中的无效字符。

请注意,您发布的行以0xaf3a 开头,这可能是此无效字符的十六进制代码。

如果您的文件有这 6 个符号 0xaf3a 并且在伪造的行中没有一个 unicode 字符,那么我猜这是 pymssql 中的一个错误。尝试更新到最新版本。

希望这会有所帮助。

【讨论】:

是的,我的文件中有 6 个符号,并且没有无效字符。我正在使用最新版本的 pymssql,我也认为它是 pymssql 的错误。谢谢 没有错误,我监督了 Dan Guzman 的评论。我的代码的SQL语句错误

以上是关于无法将特定字符串写入 mssql 数据库的主要内容,如果未能解决你的问题,请参考以下文章

具有特定 AD 帐户凭据的连接字符串

无法将 C# 应用程序连接到 MSSQL

在 nvarchar(max) 字段中插入超过 8000 个字符的 MSSQL

无法读取任何文本文件

关于压缩后字符串写入clickhouse再读取后无法反解压的问题

关于压缩后字符串写入clickhouse再读取后无法反解压的问题