Tôi không thể nhận được một chuỗi hợp lệ từ một máy chủ MSSQL vào python. Tôi tin rằng có một mã hóa không khớp ở đâu đó. Tôi tin rằng nó là giữa các lớp ODBC và python bởi vì tôi có thể nhận được kết quả có thể đọc được trong tsql và isql.Làm thế nào để cấu hình pyodbc để chấp nhận đúng chuỗi từ SQL Server bằng cách sử dụng freeTDS và unixODBC?
Mã hóa ký tự nào mà pyodbc mong đợi? Tôi cần phải thay đổi gì trong chuỗi để làm việc này?
cụ thể Ví dụ
Dưới đây là một kịch bản python đơn giản như một ví dụ:
#!/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
Kết quả của kịch bản này là:
(Decimal('4140567'), u'\U0072006f\U006e0061\U00650067')
Ngoài ra, nếu dòng cuối cùng của tập lệnh được đổi thành:
print "{0}, '{1}'".format(row.id, row.name)
Sau đó, kết quả là:
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)
Một bảng điểm sử dụng TSQL để thực hiện cùng một truy vấn:
[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)
và cũng trong isql:
[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
Vì vậy, Tôi đã làm việc này vào buổi sáng và nhìn cao và thấp và đã không tìm ra những gì là không ổn.
Chi tiết
Dưới đây là chi tiết phiên bản:
- Khách hàng là Ubuntu 12.04
- freetds v0.91
- unixodbc 2.2.14
- python 2.7.3
pyodbc 2.1.7-1 (từ gói ubuntu) & 3.0.7-beta06 (biên soạn từ nguồn)
Server là XP với SQL Server Express 2008 R2
Dưới đây là nội dung của một vài tập tin cấu hình trên máy khách.
/etc/freetds/freetds.conf
[global]
tds version = 8.0
text size = 64512
[cmw]
host = 192.168.90.104
port = 1433
tds version = 8.0
client charset = UTF-8
/etc/odbcinst.ini
[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.ini
[yourdb]
Driver = FreeTDS
Description = ODBC connection via FreeTDS
Trace = No
Servername = cmw
Database = YourDB
Charset = UTF-8
Trong công việc tiếp tục của tôi về điều này, tôi đã biên soạn phiên bản mới nhất của pyodbc, 3.0.7-beta06, _but_ không thay đổi hành vi. – MatthewD