Pergunta

Eu tenho uma tabela que é criada como esta:

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

Usando Python e cx_Oracle, se eu fizer isso:

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

Eu finalmente acabar com um valor hexadecimal de a000a000, que não é correto! No entanto, se eu fizer isso:

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

Eu obter o resultado correto. Eu tenho um sistema de conversão de tipo aqui, mas é um pouco difícil de descrever-lo aqui. Assim, alguém pode me apontar na direção certa quanto a saber se estou fazendo algo errado no nível SQL ou se algo estranho está acontecendo com meus conversões?

Foi útil?

Solução

RAWTOHEX () é para converter tipos de dados Oráculos RAW para cadeias hexadecimais. É possível que fica confuso por você passá-lo uma corda, mesmo se a cadeia contém dados binários. Neste caso, desde que a Oracle espera uma cadeia de caracteres hexadecimais, dar-lhe uma cadeia de caracteres hexadecimais.

Outras dicas

RAWTOHEX em Oracle é insensível fim bit, enquanto em sua máquina é, naturalmente sensíveis.

Observe também que um argumento para RAWTOHEX() pode ser implicitamente convertido para VARCHAR2 pela sua biblioteca (i. E. Transmitida como SQLT_STR), o que torna também a codificação e intercalação sensível.

Eu costumo definir o tipo adequado de ligações variáveis ??especialmente ao tentar passar um Oracle tipo de tipo de dados RAW para uma consulta.

Por exemplo algo como:

self.connection.setinputsizes(cx_Oracle.BINARY)
self.connection.execute(
    "INSERT INTO bin_test (b) VALUES (rawtohex(?))",
    (value,)
)
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top