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