2013-05-15 2 views
3

저는 pyodbc를 사용하여 sqlserver를 연결하고 있습니다. 연결 문자열은 다음과 같습니다. 모든 것이 적절하지만 결과는 유니 코드 문자열로 반환됩니다. 연결 문자열에는 CHARSET = UTF8이 있지만 여전히 유니 코드 문자열로 반환 하시겠습니까?pyodbc 유니 코드 문자열을 제거합니다

연결 매개 변수 자체를 사용하여 제한 할 수있는 방법이 있습니까?

유니 코드를 일반 문자열로 변환하는 추가 기능을 호출하고 싶지 않습니다.

import pyodbc as p 

connstr= 'DRIVER={SQL Server};SERVER=USERNAME\SQLEXPRESS;DATABASE=TEST;Trusted_Connection=yes;unicode_results=True;CHARSET=UTF8' 
conn = p.connect(connstr) 
print conn 
cursor = conn.cursor() 
result = cursor.execute("select * from employee1") 
for each in result: 
    print each 

답변

5

연결 문자열에서이 문제를 처리 할 수 ​​없습니다. SQL Server는 ODBC 연결 설정에 CHARSET 속성이 없으므로 아무런 도움이되지 않습니다.

전체적인 문제는 데이터가 데이터베이스의 유니 코드라는 것입니다. 해당 열의 데이터 형식은 nvarchar이며 국제 데이터 문자를 포함하는 확장 된 형식 (UTF-16 ... Windows의 UC-2 일 수 있음, 기억할 수 없음)의 데이터 형식입니다.

귀하의 옵션은 선택 쿼리에 캐스팅을 통해 데이터를 변환 할 수 있습니다, 예를 들면 :

SELECT CAST(fieldname AS VARCHAR) AS fieldname 

또는 Python으로 변환, 예를 들면 :

# to utf-8 
row.fieldname.encode('utf8') 

# to ascii, ignore non-utf-8 characters 
row.fieldname.encode('ascii', 'ignore') 

# to ascii, replace non-utf-8 characters with ? 
row.fieldname.encode('ascii', 'replace') 

필요하지 않은 경우 국제 문자 그러면 nvarchar 대신 varchar에 데이터를 저장할 수 있습니다.

+2

또한, 다른 사람이 필요합니다. 국제 문자가 있고 데이터베이스에서 형변환을 사용하면 이상한 문자가 나오고 실제 utf-16/uc-2 문자가 손실됩니다. – dkleehammer

+0

크기가 지정되지 않은 nvarchar가 아닌 nvarchar (255) 필드를 선택할 수있는 이유는 무엇입니까? 유니 코드 전용 데이터 정렬로 Unicode 데이터를 받거나 DB-Library (ISQL 등) 또는 ODBC 버전 3.7 이하를 사용하여 ntext 데이터를 클라이언트에 보낼 수 없습니다 .' – Matt