【发布时间】:2012-08-06 22:33:32
【问题描述】:
我正在尝试将二进制数据插入到 SQL Server 数据库中 image 数据类型的列中。我知道varbinary(max) 是首选数据类型,但我无权更改架构。
无论如何,我正在读取文件的内容并将其包装在 pyodbc.Binary() 中,如下所示:
f = open('Test.ics', 'rb')
ablob = f.read().encode('hex')
ablob = pyodbc.Binary(ablob)
当我print repr(ablob) 时,我看到了正确的值bytearray(b'424547494e3a5 . . .(添加了省略号)。
但是插入后
insertSQL = """insert into documents(name, documentType, document, customerNumber) values(?,?,?,?)"""
cur.execute(insertSQL, 'test200.ics', 'text/calendar', pyodbc.Binary(ablob), 1717)
文档列的值为0x343234353 . . .,看起来好像十六进制数据已转换为 ASCII 字符代码。
我认为将值包装在 pyodbc.Binary() 中会解决这个问题吗?任何帮助将不胜感激。
我正在使用 Python 2.7 和 SQL Server 2008 R2 (10.50)。
编辑:
beargle 好心地指出我不必要地调用了 encode('hex'),这导致了我的问题。我相信这一定是将数据强制转换为字符串(尽管更全面的解释会有所帮助)。
工作代码:
ablob = pyodbc.Binary(f.read())
cur.execute(insertSQL, 'test200.ics', 'text/calendar', ablob, 1717)
【问题讨论】:
-
我正在使用
SQL Server Native Client 10.0驱动程序,并且也使用SQL Server驱动程序进行了测试,结果相同。 -
为什么在用
pyodbc.Binary包装之前需要对内容进行十六进制编码? -
好点,我不需要,删除导致预期结果。谢谢!
-
很高兴听到。我确实使用十六进制编码得到了这个,你只需要解码选择结果。
标签: python sql-server-2008 pyodbc