Was ist der Unterschied zwischen auf dem Client-Ende zu hex konvertieren und mit RAWTOHEX?
Frage
Ich habe eine Tabelle, die wie folgt erstellt wird:
CREATE TABLE bin_test
(id INTEGER PRIMARY KEY, b BLOB)
Mit 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
am Ende, die nicht korrekt ist! Allerdings, wenn ich dies tun:
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 das richtige Ergebnis. Ich habe eine Art Umwandlungssystem hier, aber es ist ein bisschen schwierig, es hier zu beschreiben. Somit kann mir jemand in die richtige Richtung weisen, ob ich etwas falsch auf SQL-Ebene zu tun, oder ob etwas Seltsames geschieht mit meinem Conversions?
Lösung
RAWTOHEX () ist für Oracles RAW-Datentypen konvertieren Zeichenketten verhexen. Es ist möglich, es von Ihnen verwirrt wird es einen String übergeben, auch wenn die Zeichenfolge binäre Daten enthält. In diesem Fall, da Oracle eine Reihe von Hex-Zeichen erwartet, geben Sie ihm eine Reihe von Hex-Zeichen.
Andere Tipps
RAWTOHEX
in Oracle
ist Bitreihenfolge unempfindlich, während auf Ihrem Computer ist es natürlich empfindlich.
Beachten Sie auch, dass ein Argument RAWTOHEX()
implizit von Ihrer Bibliothek VARCHAR2
umgewandelt werden (d. H. Als SQLT_STR
übertragen), die es auch macht kodieren und Sortierungs empfindlich.
ich in der Regel die richtige Art von Variablenbindungen speziell festgelegt, wenn eine Oracle irgendwie von RAW-Datentyp in eine Abfrage zu übergeben will.
zum Beispiel so etwas wie:
self.connection.setinputsizes(cx_Oracle.BINARY)
self.connection.execute(
"INSERT INTO bin_test (b) VALUES (rawtohex(?))",
(value,)
)