【问题标题】:Issue with returning Cyrillic symbols from MSSQL via unixODBC and FreeTDS通过 unixODBC 和 FreeTDS 从 MSSQL 返回西里尔符号的问题
【发布时间】:2012-08-05 19:55:32
【问题描述】:

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

据我了解,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 

Edit1 15.08.12

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

【问题讨论】:

    标签: sql-server django odbc pyodbc freetds


    【解决方案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
    

    【讨论】:

    • 我没有尝试重建 Python。但我在 freetds.conf 中尝试了 isql 和以下客户端字符集:UTF-16、UTF-32、UCS2、UCS4。 isql 无法使用这些字符集连接到数据库。只有 UTF-8 有效。但后来我看不到西里尔符号 - 只是空格而不是它们或其他一些不可见的符号。所以在python之前的通信链就断了。
    • 字符集转换在客户端字符集 '%.*s' 和服务器字符集 '%.*s' 之间不可用 - 尝试使用 UTF-16/UCS2 连接时出错。 isql: login.c:905: tds7_send_login: Assertion `0' failed - 当我使用 UTF-32/UCS4 时出错
    • 听起来FreeTDS如果使用UCS2不知道如何处理你的SQL Server登录信息。您是否尝试过设置“客户端字符集 = UCS-2”?
    • 如果留空会发生什么?
    • 它的工作方式与 UTF-8 相同——它可以登录,但我看不到西里尔字母。我猜当您没有指定字符集时,它会使用操作系统当前设置(代码页)。
    【解决方案2】:

    好的,我已经完成了所有这些模块链:

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

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

    【讨论】:

    • 有 unicode 版本的 isql,iusql,但它对我不起作用
    【解决方案3】:

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

    此驱动程序返回正常的 utf-8,并且一切正常。

    【讨论】:

      猜你喜欢
      • 2016-02-02
      • 2012-09-09
      • 1970-01-01
      • 2013-05-31
      • 2011-05-31
      • 1970-01-01
      • 2018-02-19
      • 2020-10-12
      • 1970-01-01
      相关资源
      最近更新 更多