pyodbc 二进制列返回奇数字符 python
pyodbc Binary Column is returning odd characters python
我有一个代码可以打印来自 db 的查询,我可以毫无问题地显示 Varchar、int 和其他格式的值,但是 Byteary 的值不同。 DB 上的值类似于 0xA09080BD1160AB16
但 python 的打印结果类似于
b'\x03\x80\x03\x8c\x00\x03\x00S^k\xdb' //not actual value
根据我在网上阅读的内容,有一个 conn.add_output_converter(pyodbc.SQL_BINARY, hexToString)
但它不起作用,
pyodbc 版本为 4.0.18
import pyodbc
def hexToString(binaryString):
try:
hashString = ["{0:0>2}".format(hex(b)[2:],upper()) for b in binaryString]
return '0x' + "".join(hashString)
except:
return binaryString
query = """ select * from myDb.TestDb """
conn_str = (
r'Driver={ODBC Driver 13 for SQL Server};'
r'Server=yourserver\test;'
r'Database=test;'
r'Trusted_Connection=yes;'
r'CHARSET=UTF8;'
)
cnxn = pyodbc.connect(conn_str)
cnxn.add_output_converter(pyodbc.SQL_BINARY, hexToString)
cursor = cnxn.cursor()
try:
cursor.execute(query)
row = cursor.fetchone()
except MySQLdb.error as err:
print(err)
else:
while row is not None:
print(row)
row = cursor.fetchone()
您的输出转换器函数失败,因为您试图用 ,upper()
而不是 .upper()
调用 upper
字符串函数。但是,由于您是出于显示目的进行转换,因此您真的不应该通过输出转换器函数立即转换返回值,您应该在 print
之前对其进行格式化或将其传递给将显示它。
crsr.execute("CREATE TABLE #tmp (id INT PRIMARY KEY, foo BINARY(8) NULL)")
crsr.execute("INSERT INTO #tmp (id, foo) VALUES (1, 0xA09080BD1160AB16)")
crsr.execute("SELECT foo FROM #tmp WHERE id=1")
binary_value = crsr.fetchval() # b'\xa0\x90\x80\xbd\x11`\xab\x16'
# format for printing
print('0x' + binascii.hexlify(binary_value).decode().upper())
# prints:
# 0xA09080BD1160AB16
我有一个代码可以打印来自 db 的查询,我可以毫无问题地显示 Varchar、int 和其他格式的值,但是 Byteary 的值不同。 DB 上的值类似于 0xA09080BD1160AB16
但 python 的打印结果类似于
b'\x03\x80\x03\x8c\x00\x03\x00S^k\xdb' //not actual value
根据我在网上阅读的内容,有一个 conn.add_output_converter(pyodbc.SQL_BINARY, hexToString)
但它不起作用,
pyodbc 版本为 4.0.18
import pyodbc
def hexToString(binaryString):
try:
hashString = ["{0:0>2}".format(hex(b)[2:],upper()) for b in binaryString]
return '0x' + "".join(hashString)
except:
return binaryString
query = """ select * from myDb.TestDb """
conn_str = (
r'Driver={ODBC Driver 13 for SQL Server};'
r'Server=yourserver\test;'
r'Database=test;'
r'Trusted_Connection=yes;'
r'CHARSET=UTF8;'
)
cnxn = pyodbc.connect(conn_str)
cnxn.add_output_converter(pyodbc.SQL_BINARY, hexToString)
cursor = cnxn.cursor()
try:
cursor.execute(query)
row = cursor.fetchone()
except MySQLdb.error as err:
print(err)
else:
while row is not None:
print(row)
row = cursor.fetchone()
您的输出转换器函数失败,因为您试图用 ,upper()
而不是 .upper()
调用 upper
字符串函数。但是,由于您是出于显示目的进行转换,因此您真的不应该通过输出转换器函数立即转换返回值,您应该在 print
之前对其进行格式化或将其传递给将显示它。
crsr.execute("CREATE TABLE #tmp (id INT PRIMARY KEY, foo BINARY(8) NULL)")
crsr.execute("INSERT INTO #tmp (id, foo) VALUES (1, 0xA09080BD1160AB16)")
crsr.execute("SELECT foo FROM #tmp WHERE id=1")
binary_value = crsr.fetchval() # b'\xa0\x90\x80\xbd\x11`\xab\x16'
# format for printing
print('0x' + binascii.hexlify(binary_value).decode().upper())
# prints:
# 0xA09080BD1160AB16