2012-07-04 2 views
0

psycopg2 데이터를 에 삽입하면 PostgreSQL, '\ x00'이 포함 된 문자열을 삽입 할 수 없습니다.왜 psycopg2는 ' x00'과 같은 문자열을 삽입 할 수 없습니까?

그래서
>>> ... 
>>> print curs.mogrify('insert into test values (%s, %s)', 
... ('hello, world', 'str\x00str')) 
insert into test values ('hello, world', 'str') 
>>> ... 

, '\ x00str'입니다 :

>>> import psycopg2 
>>> import psycopg2.extensions 
>>> conn = psycopg2.connect(database='test') 
>>> curs = conn.cursor() 
>>> print curs.mogrify('insert into test values (%s, %s)', 
     ('hello, buddy', 'str\x00str')) 
>>> curs.close() 
>>> conn.close() 

내가 같은 문자열을 얻을 수 있습니다 : 여기

내 코드?

하지만, psycopg2에, 내가 뭔가에 대한 unicoding-handling을 찾을 수 있습니다.

[ '\ x01'- '\ xff] 작품을 보여줍니다.

코드와 같은 :

>>> ... 
>>> print curs.mogrify('insert into test values (%s, %s)', 
... ('hello, world', 'str\x01\x02\x03...\xffstr')) 
insert into test values ('hello, world', 'str\x01\x02\x03...\xffstr') 
>>> ... 

[ 질문] : '\의 x00str'는 어디에 있습니까? psycopg2에서 '\ x00'문자열을 어떻게 만들 수 있습니까?

+0

'\\ x00'을 사용해 보셨습니까? '\ x00'이 str을 끝내는 것처럼 보입니다 – pinkdawn

+0

'\\ x00'시도했습니다. 작동합니다. 그러나 '\ x00 \ x01'이 '\\ x00 \\ x01'이되면 길이가 같지 않습니다. – leozhang

+1

\ x 실제로 파이썬에서 어떤 것을 의미합니다 (16 진수). \ x00 == 0, \ x0e == 10 월 15 일; 그래서 len ('\ x00') = 1, len ('\\ x00') = 4; '\\ x00'은 실제로 저장하려는 문자열을 의미합니다. – pinkdawn

답변

1

문제는 문자열 중간에 0 값이있는 문자를 삽입하려고하고 PostgreSQL이 문자 데이터를 지원하지 않는다는 것입니다 (libpq는 \ 0- 종료 문자열을 반환하므로 식별 할 방법이 없습니다). 귀하의 \ 0 진짜에서). 임의의 데이터 (0 포함)를 삽입하려면 bytea 열과 psycopg2 바이너리 어댑터를 사용하십시오.

http://www.psycopg.org/psycopg/docs/module.html#psycopg2.Binary

관련 문제