cx-Oracle을 사용하여 유니코드를 삽입할 수 없음
Oracle 스키마에 Unicode를 삽입하는 데 문제가 있습니다. 데이터베이스가 Oracle 11g 인스턴스인 것 같은데 현재로서는 확실하지 않습니다.저는 OS X 10.6.8에서 python 2.6.1을 사용하고 있으며(이것은 python의 시스템 버전입니다), sourceforge.net 에서 다운로드하여 사이트 패키지가 보이는 virtualenv 1.6.1 인스턴스에 구축 및 설치된 cx-Oracle 드라이버 모듈 버전 5.1을 사용하고 있습니다.제 대본은 다음과 같습니다.
import cx_Oracle
connection = cx_Oracle.connect(
"<name>/<password>@<host>/<service-name>"
)
cursor = connection.cursor()
result = cursor.execute(u"create table UNICODE_TEST (id NUMBER(6), text NCLOB not NULL)")
raw_text = open("test.txt",'r').read()
if isinstance(raw_text,str):
raw_text = raw_text.decode("utf_8")
statement = u"insert into UNICODE_TEST (id, text) values (1,'%s')" % raw_text
result = cursor.execute(statement)
연결을 만들고, 커서를 만들고, ID와 텍스트 필드가 NUMB 및 NCLOB 유형인 테스트 테이블을 만듭니다.UTF-8로 인코딩된 텍스트가 포함된 파일을 열고 문자열을 유니코드로 디코딩합니다.유니코드 문자열에 삽입 문을 만들고 해당 문을 실행하면 이 오류가 발생합니다.
Traceback (most recent call last):
File "unicode-test.py", line 19, in <module>
result = cursor.execute(statement)
UnicodeEncodeError: 'ascii' codec can't encode character u'\u2122' in position 170: ordinal not in range(128)
Oracle 스키마에 문장을 삽입하기 전에 내 문장을 ASCII로 인코딩하려고 합니다.그래서 저는 cx-Oracle이 유니코드를 어떻게 처리하는지 더 잘 이해하기 위해 탐색을 시작했고 이것을 History에서 찾았습니다.소스포지에서 다운로드한 cx-Oracle 소스의 txt.그물
5.0.4에서 5.1로 변경
유니코드 모드 지원을 제거하고 문자열이 전달될 수 있는 모든 곳에서 유니코드가 전달되도록 허용합니다.즉, Python 3.x에서도 NLS_LANG 환경 변수 값을 사용하여 문자열이 Oracle로 전달됩니다.이렇게 하면 UNICODE 모드를 사용하여 발견된 많은 문제를 제거할 수 있으며 Python 2.x에서 Unicode를 연결 문자열이나 SQL 문에 사용할 수 없다는 불필요한 제한도 제거할 수 있습니다.
NLS_LANG 환경 변수가 'asci' 또는 이와 동등한 값으로 설정되어 있기 때문에 NLS_LANG를 'AL32'로 설정하려고 합니다.UTF8'은 유니코드 값이 맞다고 생각하며, 연결을 만들기 전에 새 값을 설정합니다.
os.environ["NLS_LANG"] = "AL32UTF8"
connection = cx_Oracle.connect(
"<user>/<password>@<host>/<service-name>"
)
cursor = connection.cursor()
...
하지만 저는 이 오류를 받습니다.
Traceback (most recent call last):
File "unicode-test.py", line 11, in <module>
"<user>/<password>@<host>/<service-name>"
cx_Oracle.DatabaseError: ORA-12705: Cannot access NLS data files or invalid environment specified
그래서 나는 NLS_LANG 값을 조작할 수 없을 것 같습니다.
지금부터 제 질문이 있습니다.잘못된 열 유형과 같은 간단한 것이 누락되었습니까?cx-Oracle 드라이버에 문제가 있습니까?cx-Oracle 모듈을 구축할 때 "WITH_UNICODE" 환경 변수를 설정해야 하는데 어떻게 해야 합니까?Oracle 인스턴스에 문제가 있습니까?저는 Oracle에 대한 경험이 거의 없으며 Oracle과 python을 함께 작업한 적이 없습니다.이 문제에 대해 이틀 동안 연구했으며 DBA 그룹에 가기 전에 문제가 무엇인지 더 잘 알고 싶습니다.
감사해요.
환경변수 설정은 올바른 방법이지만 "AL32UTF8"은 NLS_LANG에 대한 올바른 값이 아닙니다.Oracle 인스턴스에 사용된 NLS_LANG의 올바른 값을 가져오려면 다음을 실행합니다.
SELECT USERENV ('language') FROM DUAL
언급URL : https://stackoverflow.com/questions/14238824/cannot-insert-unicode-using-cx-oracle
'bestsource' 카테고리의 다른 글
문화 정보를 기반으로 날짜 및 시간 형식을 얻으려면 어떻게 해야 합니까? (0) | 2023.07.13 |
---|---|
플래터 앱에서 달력 보기를 추가하는 올바른 방법은 무엇입니까? (0) | 2023.07.13 |
아이폰이나 안드로이드에서 HTML5가 있는 네이티브 풀스크린 비디오 플레이어를 피할 수 있습니까? (0) | 2023.07.13 |
지정된 날짜에서 월의 마지막 날을 얻는 방법은 무엇입니까? (0) | 2023.07.13 |
Mongoose 사용만 생성됨타임스탬프 (0) | 2023.07.13 |