¿Cuál es la diferencia entre convertir a hexadecimal en el extremo del cliente y usar rawtohex?

StackOverflow https://stackoverflow.com/questions/1034068

Pregunta

Tengo una tabla que se crea así:

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

Usando Python y cx_Oracle, si hago esto:

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")

Finalmente termino con un valor hexadecimal de a000a000 , ¡lo cual no es correcto! Sin embargo, si hago esto:

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")

Obtengo el resultado correcto. Tengo un sistema de conversión de tipos aquí, pero es un poco difícil describirlo aquí. Por lo tanto, ¿alguien puede señalarme en la dirección correcta si estoy haciendo algo mal en el nivel SQL o si algo extraño está sucediendo con mis conversiones?

¿Fue útil?

Solución

rawtohex () es para convertir tipos de datos RAW de Oracles a cadenas hexadecimales. Es posible que se confunda al pasarle una cadena, incluso si la cadena contiene datos binarios. En este caso, dado que Oracle espera una cadena de caracteres hexadecimales, dele una cadena de caracteres hexadecimales.

Otros consejos

RAWTOHEX en Oracle es insensible al orden de bits, mientras que en su máquina es, por supuesto, sensible.

También tenga en cuenta que su biblioteca puede convertir implícitamente un argumento a RAWTOHEX () (es decir, transmitir como SQLT_STR ) también lo hace sensible a la codificación y a la ordenación.

Por lo general, establezco el tipo adecuado de enlaces variables, especialmente cuando intento pasar un tipo de datos RAW de Oracle a una consulta.

por ejemplo algo como:

self.connection.setinputsizes(cx_Oracle.BINARY)
self.connection.execute(
    "INSERT INTO bin_test (b) VALUES (rawtohex(?))",
    (value,)
)
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top