2

次のように作成されたテーブルがあります。

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

Pythonとcx_Oracleを使用して、これを行う場合:

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

最終的に16進値がになりますがa000a000、これは正しくありません。しかし、私がこれを行う場合:

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

正しい結果が得られます。ここに型変換システムがありますが、ここで説明するのは少し難しいです。したがって、SQLレベルで何か間違ったことをしているのか、それとも変換で何か奇妙なことが起こっているのかについて、誰かが私を正しい方向に向けることができますか?

4

3 に答える 3

1

RAWTOHEXinOracleはビット順序に影響されませんが、マシン上ではもちろん影響を受けます。

また、toの引数は、ライブラリによってRAWTOHEX()暗黙的に変換さVARCHAR2れる(つまり、として送信されるSQLT_STR)可能性があることに注意してください。これにより、ライブラリはエンコードと照合の影響を受けやすくなります。

于 2009-06-23T17:51:15.107 に答える
1

rawtohex()は、OracleのRAWデータ型を16進文字列に変換するためのものです。文字列にバイナリデータが含まれている場合でも、文字列を渡すと混乱する可能性があります。この場合、Oracleは16進文字の文字列を想定しているため、16進文字の文字列を指定します。

于 2009-06-23T17:55:29.107 に答える
0

私は通常、Oracleの一種のRAWデータ型をクエリに渡そうとするときに、適切なタイプの変数バインディングを特別に設定します。

たとえば、次のようなものです。

self.connection.setinputsizes(cx_Oracle.BINARY)
self.connection.execute(
    "INSERT INTO bin_test (b) VALUES (rawtohex(?))",
    (value,)
)
于 2009-11-10T19:29:34.230 に答える