最近遇到几个需求,需要从centos上通过python访问sql server服务器查询数据,本来倒也不是很复杂,通过pyodbc比较顺利地实现了,具体如下:
- 先直接通过yum安装unixODBC、unixODBC-devel和freetds (pyodbc需要)
- 然后源码编译安装pyodbc
- 配置/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会做字符集的默认转换,结果就是这个转换导致了中文变问号。解决方法:
- 首先,freetds必须源码安装,在编译时指定参数disable-libiconv,禁止自动转换:./configure --enable-msdblib --prefix=/usr/local/freetds --with-tdsver=8.0 --disable-libiconv
- 然后,连接数据库时需要指定tds_version参数,版本太低会有问题,我用的是8.0(访问sql server 2008 R2)
- 在获取返回结果时,由于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
相关推荐
本文档主要描述了Linux下python数据库驱动的安装和配置,用来实现在Linux平台下通过python访问MySQL、Oracle、SQL Server数据库。 其中包括以下几个软件的安装及配置: unixODBC FreeTDS pyodbc cx_Oracle 欢迎转载...
数据库课设 基于Python+PyQt+SQLServer的图书管理系统源码+详细说明+全部数据资料(高分项目).zip数据库课设 基于Python+PyQt+SQLServer的图书管理系统源码+详细说明+全部数据资料(高分项目).zip 【备注】 1、该...
【MSSQL 】SQLServer分布式集群Python自动故障转移脚本 #安装依赖 pip install pymssql #windows打包 pyinstaller -w -F mssqlScript.py ######or pyinstaller -F mssqlScript.py #windows运行 ./mssqlScript.exe ...
软件开发设计:应用软件开发、系统软件开发、移动应用开发、网站开发C++、Java、python、web、C#等语言的项目开发与学习资料 硬件与设备:单片机、EDA、proteus、RTOS、包括计算机硬件、服务器、网络设备、存储设备...
软件开发设计:应用软件开发、系统软件开发、移动应用开发、网站开发C++、Java、python、web、C#等语言的项目开发与学习资料 硬件与设备:单片机、EDA、proteus、RTOS、包括计算机硬件、服务器、网络设备、存储设备...
包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。 包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、python...
包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。 包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、python...
第1章 Linux操作系统 1 1.1 Linux的简要历史介绍 1 1.2 Linux核心 2 1.2.1 Linux的开发特点 2 1.2.2 Linux分发包 3 1.2.3 为什么要为商业Linux 版本付费 3 1.3 Linux与其他操作系统之间的差异 3 1.3.1 功能丰富 3 ...
包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。 包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、python...
包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。 包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、python...
软件开发设计:应用软件开发、系统软件开发、移动应用开发、网站开发C++、Java、python、web、C#等语言的项目开发与学习资料 硬件与设备:单片机、EDA、proteus、RTOS、包括计算机硬件、服务器、网络设备、存储设备...
包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。 包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、python...
pymssql 是Python语言用来连接微软 SQL SERVER 数据库的类库,实现了 Python DB API 2.0 。 示例代码: import pymssql conn = pymssql.connect(host='SQL01', user='user', password='password', database='...
软件开发设计:应用软件开发、系统软件开发、移动应用开发、网站开发C++、Java、python、web、C#等语言的项目开发与学习资料 硬件与设备:单片机、EDA、proteus、RTOS、包括计算机硬件、服务器、网络设备、存储设备...
包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。 包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、python...
包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。 包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、python...
包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。 包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、python...
SQL标准的广泛支持使得MySQL易于学习,且与其他关系型数据库系统有良好的互操作性。 存储引擎 MySQL支持多种存储引擎,如InnoDB、MyISAM、MEMORY等,每种引擎都有特定的优势和适用场景。例如,InnoDB提供事务安全、...