通过unixODBC和FreeTDS从MSSQL返回Cyrillic符号的问题

时间:2012-08-08 16:32:42

标签: sql-server django odbc pyodbc freetds

我在远程主机上的Ubuntu 12.04 LTS和MSSQL 2008上使用django-pyodbc作为数据库后端。除了返回西里尔符号外,它的效果很好。而不是他们,我看到问号 - '?'。我已经开始调查可能导致这个问题的原因。

据我所知,MSSQL-django链看起来如此:

  

MSSQL< - > FreeTDS< - > unixODBC< - > pyodbc< - > Django的pyodbc

所以我从FreeTDS开始。当我在tsql中运行查询时 - 它运行良好我可以看到所有符号,包括Cyrillic。

下一个是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 

Edit1 15.08.12

在使用pyodbc的python中我得到'?'而不是西里尔符号 - 我已经尝试了两个python版本:UCS2和UCS4。

3 个答案:

答案 0 :(得分:1)

你得到了吗?返回不可打印的字符

运行以下命令,查看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

答案 1 :(得分:0)

好的,我已经让所有这些模块链工作了:

MSSQL <-> FreeTDS <-> unixODBC <-> pyodbc <-> django-pyodbc

我刚添加'unicode_results':在django设置中的DATABASES选项中为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参数。无论如何,网站现在能够显示西里尔符号。

答案 2 :(得分:0)

我在一周内与西里尔字母的问题作斗争。我找到了不同的解决方案,我只是使用用于Linux的microsoft mssql驱动程序,这里很好的如何在支持的发行版之外安装它(Suse,redhat):https://groups.google.com/forum/#!topic/shiny-discuss/AyFthz3UGwg

这个驱动程序返回正常的utf-8,一切都在包中。