我在远程主机上使用 django-pyodbc 作为 Ubuntu 12.04 LTS 和 MSSQL 2008 上的数据库后端。除了返回西里尔符号外,它工作得很好。我看到的不是问号——"?"。我已经开始调查可能导致此问题的原因。
据我了解,MSSQL-django链是这样的:
MSSQL <-> FreeTDS <-> unixODBC <-> pyodbc <-> django-pyodbc
所以我从FreeTDS开始。当我在 tsql 中运行查询时 - 它工作得很好,我可以看到包括西里尔文在内的所有符号。
下一个是isql - 据我所知,我可以测试FreeTDS <-> unixODBC对。在那里我没有获得适当的数据。事实上,当我在包含西里尔符号的 isql 列中运行查询时,它们是空的或由不可见的符号组成。我想FreeTDS <-> unixODBC 之间的通信问题。什么可能导致此问题?顺便说一句,我也尝试过 iusql - 没有任何变化。
MSSQL 排序规则Cyrillic_General_CI_AS。
freetds.conf的内容:
[global]
tds version = 4.2
dump file = /tmp/freetds.log
debug flags = 0xffff
timeout = 10
connect timeout = 10
client charset = UTF-8
text size = 64512
[egServer50]
host = symachine.domain.com
port = 5000
tds version = 5.0
[egServer70]
host = ntmachine.domain.com
port = 1433
tds version = 7.0
[rfxdigest]
host = mssql-iis-1
port = 1433
tds version = 8.0
client charset = UTF-8
ODBC 的内容.ini:
[RFX]
Description = Rfx digest server
Driver = FreeTDS
Database = RFXDB
Servername = rfxdigest
TDS_Version = 8.0
编辑1 15.08.12
在使用pyodbc的python中,我得到"?"而不是西里尔符号 - 我已经尝试了两个python版本:UCS2和UCS4。
对于不可打印的字符,返回一个 ?
运行以下命令以查看您的 Python 设置支持哪些 unicode :-
python -c "import sys;print(sys.maxunicode<66000)and'UCS2'or'UCS4'"
接下来需要设置 FreeTDS 以使用与 Python 相同的字符集。如果 FreeTDS 不支持您在 Python 中使用的 unicode 格式,则需要同时更改 Python 和 FreeTDS。
要在启用UCS2的情况下从源代码重建Python,您需要执行以下操作:-
$ ./configure --enable-unicode=ucs2
$ make
$ sudo make install
好的,我已经使所有这些模块链工作:
MSSQL <-> FreeTDS <-> unixODBC <-> pyodbc <-> django-pyodbc
我刚刚在 django 设置的数据库选项中添加了 'unicode_results':True:
DATABASES = {
'default': {
'ENGINE': 'sql_server.pyodbc', # Add 'postgresql_psycopg2', 'postgresql', 'mysql', 'sqlite3' or 'oracle'.
'NAME': 'name', # Or path to database file if using sqlite3.
'USER': 'user', # Not used with sqlite3.
'PASSWORD': 'pwd', # Not used with sqlite3.
'HOST': 'server-name', # Set to empty string for localhost. Not used with sqlite3.
'PORT': 'port', # Set to empty string for default. Not used with sqlite3.
'OPTIONS': {
'unicode_results':True,
'driver': 'FreeTDS',
'host_is_server': True,
'extra_params': 'TDS_VERSION=8.0'
}
但是 pyodbc 和 isql 仍然无法正常工作 - 也许我错过了其他特定于 unicode 的参数。稍后将检查 odbc 和 pyodbc 如何使用此unicode_results参数。无论如何,网站现在能够显示西里尔符号。
我在一周内与西里尔字母的问题作斗争。我找到了不同的解决方案,我只使用适用于Linux的Microsoft mssql驱动程序,这是在支持的发行版(Suse,redhat)之外的安装它的好方法:https://groups.google.com/forum/#!topic/shiny-discuss/AyFthz3UGwg
此驱动程序返回正常的 utf-8,并且所有内容都脱离了包。