2009-06-23 6 views
2

Ich habe eine Tabelle, die wie folgt erstellt wird:Was ist der Unterschied zwischen der Konvertierung in hex auf dem Client-Ende und der Verwendung von Rawtohex?

CREATE TABLE bin_test 
(id INTEGER PRIMARY KEY, b BLOB) 

Verwendung von Python und cx_Oracle, wenn ich dies tun:

value = "\xff\x00\xff\x00" #The string represented in hex by ff00ff00 
self.connection.execute("INSERT INTO bin_test (b) VALUES (rawtohex(?))", 
         (value,)) 
self.connection.execute("SELECT b FROM bin_test") 

ich schließlich mit einem Hex-Wert von a000a000, das nicht am Ende ist richtig! Aber wenn ich das tue:

import binascii 
value = "\xff\x00\xff\x00" 
self.connection.execute("INSERT INTO bin_test (b) VALUES (?)", 
         (binascii.hexlify(value,))) 
self.connection.execute("SELECT b FROM bin_test") 

Ich bekomme das richtige Ergebnis. Ich habe hier ein Typumwandlungssystem, aber es ist ein bisschen schwierig, es hier zu beschreiben. Kann mir also jemand in die richtige Richtung zeigen, ob ich auf SQL-Ebene etwas falsch mache oder ob etwas Seltsames mit meinen Conversions passiert?

Antwort

1

rawtohex() dient zum Konvertieren von RAW-Datentypen in Hexadezimalzeichenfolgen. Es ist möglich, dass es verwirrt wird, wenn Sie ihm eine Zeichenfolge übergeben, auch wenn die Zeichenfolge binäre Daten enthält. Da Oracle in diesem Fall eine Zeichenfolge aus Hexadezimalzeichen erwartet, geben Sie ihm eine Zeichenfolge aus Hexadezimalzeichen.

1

RAWTOHEX in Oracle ist Bit-Reihenfolge unempfindlich, während auf Ihrem Computer ist es natürlich empfindlich.

Beachten Sie auch, dass ein Argument zu RAWTOHEX() implizit in VARCHAR2 von Ihrer Bibliothek umgewandelt werden (i. E. Übertragen, wie SQLT_STR), die es auch empfindlich kodieren und Zusammenstellung macht.

0

Normalerweise setze ich den richtigen Typ von Variablenbindungen speziell beim Versuch, ein Oracle irgendwie RAW-Datentyp in eine Abfrage zu übergeben.

zum Beispiel so etwas wie:

self.connection.setinputsizes(cx_Oracle.BINARY) 
self.connection.execute(
    "INSERT INTO bin_test (b) VALUES (rawtohex(?))", 
    (value,) 
)