2014-07-25 4 views
0

pyodbc를 사용하여 Latin1_General_CI_AI 인코딩으로 MS SQL Server 데이터베이스와 통신하는 장고 앱이 있습니다. (나는이 데이터베이스 여부를 제어 할 수 없습니다 및 인코딩을 변경할 수 없습니다.)Django pyodbc Latin1_General_CI_AI 인코딩

문제를 장고에서가는 모든 문자열이 있다는 것입니다 -> pyodbc 인코딩해야합니다 :

m = MyModel() 
m.foo = 'foo' # Garbage characters are saved 
m.foo = 'foo'.encode('latin1') # String is saved correctly 
m.save() 

: 예를 들어

두 번째 문제는 쿼리 문자열도 인코딩해야한다는 것입니다.

MyModel.objects.get(name=name) # fails 
MyModel.objects.get(name=name.encode('latin1')) # works 

더 일반적인 방법으로 처리 할 수 ​​있습니까? 모델 믹스 인 또는 DB 백엔드 중 하나? 내가 장고의 SQLCompiler에 장소를 볼 수 있지만 어떻게 영향을 미칠.

답변

0

비슷한 문제가 발생했는데 비슷한 해결책이있었습니다.

나를 위해 연결 매개 변수 ClientCharset=utf8을 추가하면 문제가 해결되었습니다. 나를 좋아하는 django-pyodbc을 사용한다면 데이터베이스 구성 설정에 'OPTIONS': { 'extra_params': 'ClientCharset=utf8', } 을 추가하는 것입니다. pyodbc를 직접 사용하는 경우 연결 문자열에 추가 할 수 있습니다.

여기에있는 트릭은 TDS 드라이버가 원본 데이터베이스에서 클라이언트가 읽을 수있는 적절한 기본 인코딩으로 변환하려고 시도하고 있다는 것입니다. 여기서 Microsoft의 토지에 대해 이야기하고 있기 때문에 적절한 기본값은 ISO 8859-1입니다 (이 값이 Latin-1인지 정확하게 기억하지 못하거나 사람들이 그 차이를 느끼지 못하는 경우). 그게 당신의 해결 방법이 작동하는 이유입니다. 자세한 내용은 here을 참조하십시오.

Django는 데이터베이스가 talking utf-8 일 것으로 예상하므로 여기서는 TDS 드라이버에게 우리가 듣고 싶은 것을 말합니다.