クライアント側で16進数に変換することとrawtohexを使用することの違いは何ですか?

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

質問

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

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

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

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レベルで何か間違っているのか、変換で奇妙なことが起こっているのかについて正しい方向に向けることができますか?

役に立ちましたか?

解決

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

他のヒント

Oracle

RAWTOHEX はビット順を区別しませんが、マシン上ではもちろん区別します。

また、 RAWTOHEX()への引数は、ライブラリによって暗黙的に VARCHAR2 に変換(つまり、 SQLT_STR として送信)できることに注意してください。エンコードと照合も重要になります。

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

たとえば次のようなもの:

self.connection.setinputsizes(cx_Oracle.BINARY)
self.connection.execute(
    "INSERT INTO bin_test (b) VALUES (rawtohex(?))",
    (value,)
)
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top