2017-11-29 14 views
1

DB에서 쿼리를 인쇄하는 코드가 있습니다. Varchar, int 및 다른 형식의 값을 표시하는 데 문제가 없습니다. 그러나 Byteary의 값은 다릅니다. DB를의 값은 내가 인터넷에서 읽은 내용을 바탕으로pyodbc 이진 열이 홀수 문자를 반환합니다 파이썬

b'\x03\x80\x03\x8c\x00\x03\x00S^k\xdb' //not actual value 

가하는 conn.add_output_converter(pyodbc.SQL_BINARY, hexToString) 있지만 작동하지 않는 존재처럼 pyodbc 버전에서입니다 0xA09080BD1160AB16 같은 있지만, 파이썬의 인쇄의 결과입니다 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() 
+0

이진 데이터를 보유하는 T-SQL 열 유형은 무엇입니까? 바이너리? 변종인가요? 다른 것 ? –

+0

해당 이진수 (8), null – Led

+0

출력 변환기 기능없이 [this code] (https://pastebin.com/FNNh7RhY)를 실행하면 어떻게됩니까? 나는'b '\ xa0 \ x90 \ x80 \ xbd \ x11 \'\ xab \ x16'을 얻는다. –

답변

1

귀하의 출력 변환 기능을 사용하면 ,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 
+0

대단히 고맙습니다. 실제로이 부분을 놓친 것처럼 보입니다. – Led