MSSQL 서버에서 유효한 문자열을 파이썬으로 가져올 수 없습니다. 어딘가에 인코딩 불일치가 있다고 생각합니다. 나는 그것이 tsql과 isql에서 읽기 가능한 결과를 얻을 수 있기 때문에 그것이 ODBC 계층과 파이썬 사이에 있다고 생각한다.freeTDS 및 unixODBC를 사용하여 SQL Server의 문자열을 올바르게 받아들이도록 pyodbc를 구성하는 방법은 무엇입니까?
pyodbc는 어떤 문자 인코딩을 기대합니까? 이 기능을 사용하려면 체인에서 무엇을 변경해야합니까?
가#!/usr/bin/env python
import pyodbc
dsn = 'yourdb'
user = 'import'
password = 'get0lddata'
database = 'YourDb'
def get_cursor():
con_string = 'DSN=%s;UID=%s;PWD=%s;DATABASE=%s;' % (dsn, user, password, database)
conn = pyodbc.connect(con_string)
return conn.cursor()
if __name__ == '__main__':
c = get_cursor()
c.execute("select id, name from recipe where id = 4140567")
row = c.fetchone()
if row:
print row
이 스크립트의 출력은 :
구체 예 다음
는 일례로서 간략화 파이썬 스크립트,
(Decimal('4140567'), u'\U0072006f\U006e0061\U00650067')
대안 마지막 줄의 경우, 스크립트가 다음으로 변경됩니다.
,766,631,696,그런 다음 결과는 다음과 같습니다
Traceback (most recent call last):
File "/home/mdenson/projects/test.py", line 20, in <module>
print "{0}, '{1}'".format(row.id, row.name)
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-2: ordinal not in range(128)
같은 쿼리 실행 TSQL을 사용하는 증명서 : isql을 에도
[email protected]:~# tsql -S cmw -U import -P get0lddata
locale is "C"
locale charset is "ANSI_X3.4-1968"
using default charset "UTF-8"
1> select id, name from recipe where id = 4140567
2> go
id name
4140567 orange2
(1 row affected)
과 : 그래서
[email protected]:~# isql -v yourdb import get0lddata
SQL> select id, name from recipe where id = 4140567
+----------------------+--------------------------+
| id | name |
+----------------------+--------------------------+
| 4140567 | orange2 |
+----------------------+--------------------------+
SQLRowCount returns 1
1 rows fetched
을 나는 아침에이 일을했다. 높고 낮게 보였고 어리 석다는 것을 알아 내지 못했습니다.
세부 여기
버전의 세부 사항은 다음과 같습니다
- 클라이언트 우분투 12.04
- FreeTDS를의 v0.91
- 파이썬
- 2.2.14 인 unixODBC입니다 2.7.3
pyodbc 2.1.7-1 (우분투 패키지에서)(소스에서 컴파일 된)3.0.7-beta06
서버는 다음 클라이언트에서 몇 가지 구성 파일의 내용입니다 SQL Server Express에 2008 R2
와 XP입니다.
/etc/odbcinst.ini
[global]
tds version = 8.0
text size = 64512
[cmw]
host = 192.168.90.104
port = 1433
tds version = 8.0
client charset = UTF-8
[FreeTDS]
Description = TDS driver (Sybase/MS SQL)
Driver = /usr/lib/x86_64-linux-gnu/odbc/libtdsodbc.so
Setup = /usr/lib/x86_64-linux-gnu/odbc/libtdsS.so
CPTimeout =
CPReuse =
FileUsage = 1
을/etc/ODBC를
/etc/freetds/freetds.conf.ini[yourdb]
Driver = FreeTDS
Description = ODBC connection via FreeTDS
Trace = No
Servername = cmw
Database = YourDB
Charset = UTF-8
필자는이 작업을 계속하면서 pyodbc 3.0.7-beta06의 최신 버전을 컴파일했지만 동작에 변화가 없었습니다. – MatthewD