`
CtripMySQLDBA
  • 浏览: 57232 次
  • 来自: 上海
社区版块
存档分类
最新评论

Linux系统通过python访问SQL SERVER,无法显示数据库内中文的问题

阅读更多

最近遇到几个需求,需要从centos上通过python访问sql server服务器查询数据,本来倒也不是很复杂,通过pyodbc比较顺利地实现了,具体如下:

 

  1. 先直接通过yum安装unixODBC、unixODBC-devel和freetds (pyodbc需要)
  2. 然后源码编译安装pyodbc
  3. 配置/etc/odbcinst.ini,添加连接sql server的数据源信息 (路径按实际情况填写)
[SQL Server]
Description     = FreeTDS ODBC driver for MSSQL
Driver      = /usr/local/freetds/lib/libtdsodbc.so
Setup       = /usr/local/freetds/lib/libtdsS.so
FileUsage       = 1

 配置完成后就可以直接访问sql server数据库进行查询了

#!/usr/bin/env python
#-*- encoding: utf-8 -*-
import pyodbc
conn=pyodbc.connect('DRIVER={SQL Server};SERVER=xxx.xxx.xxx.xxx;port=1433;DATABASE=testdb;UID=user;PWD=password')
cursor=conn.cursor()
cursor.execute("select name from test")
row=cursor.fetchone()
print row[0]

 

然而,还没有高兴多久就发现一个大问题,数据库中存储的中文字符不能正常显示,全部变成了问号。这其实也很正常,因为sql server里面的字符编码不是通用的utf-8(所以说windows上的东西就是难搞啊)。虽然知道原因,但是要解决这个问题却也不是很容易,在对freetds的charset设置和pyodbc连接的charset设置进行各种调整尝试,返回结果也各种encode、decode之后,问号依然是顽强的问号。

 

在被问号折腾了好久快要放弃的时候,终于找到了解决办法。究其根本原因,还是Linux和window系统间的不同字符集问题,这实在是个难翻的墙啊。freetds会做字符集的默认转换,结果就是这个转换导致了中文变问号。解决方法:

  1. 首先,freetds必须源码安装,在编译时指定参数disable-libiconv,禁止自动转换:./configure --enable-msdblib --prefix=/usr/local/freetds --with-tdsver=8.0 --disable-libiconv
  2. 然后,连接数据库时需要指定tds_version参数,版本太低会有问题,我用的是8.0(访问sql server 2008 R2)
  3. 在获取返回结果时,由于sql server内部是gbk编码的,因此需要把结果从gbk进行解码,这样才能在utf8环境中正常显示。
conn=pyodbc.connect('DRIVER={SQL Server};SERVER=xxx.xxx.xxx.xxx;port=1433;DATABASE=testdb;UID=user;PWD=password;TDS_Version=8.0')
cursor=conn.cursor()
cursor.execute("select name from test")
row=cursor.fetchone()
print row[0].decode('gbk')

 

这样,终于成功地把中文正常显示出来了!不过还需要注意,如果中文字符在sql server中是使用unicode方式存储的(nvarchar nchar),那么还是会乱码,不过这个问题也很容易处理,在select的时候进行下转换即可,例如select convert(varchar,name) as name

 

 

 

 

 

5
0
分享到:
评论
2 楼 CtripMySQLDBA 2013-05-13  
martyl 写道
freetds的转换没看懂,是什么转换到了什么,这种转换是否有配置文件中的项可以指定?

另外SQL Server中对Unicode字段编码是UCS-2,确实比较罕见,2012版本开始同时支持UTF-16,还未有支持Linux最常用的UTF-8。想来freetds是专门的SQL Server驱动应该有考虑这点,硬转nvarchar有点不自然。


关于freetds的那个转换动作,官方是这么说明的:
【--disable-libiconv
By default, configure will search your system for an iconv library for use with Microsoft servers (because TDS 7.0 employs Unicode). This switch prevents that search. If no iconv library is used, FreeTDS relies on its built-in iconv emulation, which is capable of converting ISO-8859-1 to UCS-2, sufficient for many applications.

所以按理说,这个动作不会让mssql里面的中文乱码的,但是确实开了禁用参数以后解决了我的问题。这个在配置文件里面没法控制,配置文件里面的charset不管怎么设置(utf8,gbk,cp936等等)都没用,中文依然是问号。
另外,关于nvarchar的UCS-2编码问题,freetds确实应该是支持的(上面的官方说明上也有提到),但是我在pyodbc返回的结果就是没办法正确解码,所以还是硬转下nvarchar比较容易。
鉴于我毕竟不是专业的python开发,只能尽量做到满足自己的需求,如果大家有好的方法请不吝分享下,欢迎多多指教
1 楼 martyl 2013-05-12  
freetds的转换没看懂,是什么转换到了什么,这种转换是否有配置文件中的项可以指定?

另外SQL Server中对Unicode字段编码是UCS-2,确实比较罕见,2012版本开始同时支持UTF-16,还未有支持Linux最常用的UTF-8。想来freetds是专门的SQL Server驱动应该有考虑这点,硬转nvarchar有点不自然。

相关推荐

    20120417_用Python访问SqlServer1

    标题中的“20120417_用Python访问SqlServer1”暗示了这是一个关于使用Python连接Microsoft SQL Server的教程,而描述进一步确认了这一点,讲述了在Windows和Linux环境下配置Python访问SQL Server的步骤。标签...

    UNIX_Linux下使用FreeTDS访问Microsoft SQL Server数据库.pdf

    在UNIX和Linux操作系统环境下,访问Microsoft SQL Server数据库的需求日益增长,而FreeTDS库就是解决这一问题的关键。FreeTDS是一个开源项目,它允许Linux和类UNIX系统与Microsoft的SQL Server数据库进行通信,实现...

    Python的Flask框架与数据库连接的教程

    在Linux或OSX系统中,需要使用`chmod a+x script.py`命令给予脚本执行权限,然后通过`./script.py <arguments>`来运行。而在Windows系统中,则需要明确地使用`flask\Scripts\python script.py <arguments>`。 接...

    Linux下通过python访问MySQL、Oracle、SQL Server数据库的方法

    本文档主要描述了Linux下python数据库驱动的安装和配置,用来实现在Linux平台下通过python访问MySQL、Oracle、SQL Server数据库。 其中包括以下几个软件的安装及配置: unixODBC FreeTDS pyodbc cx_Oracle 欢迎转载...

    Linux下通过odbc连接sqlserver服务器的安装包

    在Linux环境中,与Windows系统不同,SQL Server数据库的直接访问通常需要通过ODBC(Open Database Connectivity)驱动程序来实现。本安装包包含了两个关键组件,它们是连接SQL Server的基石:freetds和unixODBC。 1...

    sqlserver/oracle/mysql/等数据库驱动大全

    SQL Server ODBC驱动是微软提供的,用于连接到SQL Server数据库的关键组件。它支持多种版本的SQL Server,包括Express、Standard、Enterprise等,并且可以在Windows操作系统上运行。通过这个驱动,开发者可以使用...

    sql server2019安装包

    SQL Server 2019是Microsoft推出的一款关系型数据库管理系统,是SQL Server系列中的一个重要版本。它提供了强大的数据存储、处理和分析能力,广泛应用于企业级数据库应用开发和数据分析。在本安装包中,主要包含的是...

    sql-server驱动包

    SQL Server驱动包是用于连接Microsoft SQL Server数据库的关键组件,它提供了必要的接口,使得应用程序能够与SQL Server进行数据交互。在本篇文章中,我们将深入探讨SQL Server驱动的不同类型、其工作原理以及如何...

    SQL Server ODBC 驱动

    **SQL Server ODBC驱动**是连接到Microsoft SQL Server数据库的关键组件,它允许应用程序通过开放数据库连接(ODBC)标准与SQL Server进行通信。ODBC是一种跨平台的数据访问接口,使得不同编程语言和操作系统上的...

    PyPI 官网下载 | tencentcloud-sdk-python-sqlserver-3.0.335.tar.gz

    "tencentcloud-sdk-python-sqlserver"这部分表明这是一个腾讯云提供的SDK,专门针对Python环境,用于操作SQL Server数据库。"3.0.335"则是这个版本号,表示这是该SDK的第3.0.335版,通常每个版本都会有性能优化、新...

    模具管系统,Python+Pyqt5+sqlserver

    模具管理系统是针对小型企业设计的一款应用,它利用Python编程语言,结合PyQt5图形用户界面库,以及SQL Server数据库技术,实现了一套高效、易用的模具管理解决方案。这款系统的特点在于其开源性质,所有代码均对...

    sqlserver2019中文帮助(带书签,高清)

    SQL Server 2019是Microsoft推出的一款关系型数据库管理系统,具有强大的数据处理能力和高度的安全性。本中文帮助文档提供了全面的指引,涵盖了从安装、配置到管理和优化的各个环节。 在【新增功能】部分,SQL ...

    MSSQL SQLServer分布式集群Python自动故障转移脚本

    【MSSQL 】SQLServer分布式集群Python自动故障转移脚本 #安装依赖 pip install pymssql #windows打包 pyinstaller -w -F mssqlScript.py ######or pyinstaller -F mssqlScript.py #windows运行 ./mssqlScript.exe ...

    mysql+oracle+sqlserver三大数据库驱动包

    MySQL、Oracle和SQL Server是三款非常流行的数据库管理系统(DBMS),广泛应用于各种规模的企业和项目。本文将深入探讨这三大数据库系统及其驱动包的相关知识点。 首先,MySQL是一款开源、免费的关系型数据库管理...

    SQLServer2017c.rar

    它支持数据查询、数据更新、流程控制、异常处理等功能,是开发和管理SQL Server数据库的基础。 5. **备份与恢复**:SQL Server提供了多种备份类型,如完整备份、差异备份、日志备份等,以及相应的恢复模式。这些...

    数据库课设 基于Python+PyQt+SQLServer的图书管理系统源码+详细说明+全部数据资料(高分项目).zip

    数据库课设 基于Python+PyQt+SQLServer的图书管理系统源码+详细说明+全部数据资料(高分项目).zip数据库课设 基于Python+PyQt+SQLServer的图书管理系统源码+详细说明+全部数据资料(高分项目).zip 【备注】 1、该...

    SQLServer 2019

    SQL Server 2019是微软公司推出的数据库管理系统,它在SQL Server系列中扮演着重要的角色,特别是对于那些需要高效、可靠且经济实惠的数据存储和管理解决方案的企业而言。本篇文章将深入探讨SQL Server 2019的核心...

    Django 连接sql server数据库的方法

    总之,虽然Django默认不支持SQL Server,但通过安装第三方模块以及适当配置,仍然可以实现Django项目与SQL Server数据库的集成。这不仅为Django开发者提供了更丰富的数据库选择,也为使用特定数据库产品的公司提供了...

    微软推出适用于Linux和Docker的SQL Server 2017版本.pdf

    同时,支持Microsoft Active Directory身份验证系统,使得在Linux上对SQL Server的访问变得更加安全。 **机器学习和AI支持** SQL Server 2017引入了对R和Python的支持,允许在数据库内部进行分析,无需提取和转换...

Global site tag (gtag.js) - Google Analytics