Connector/Python Python鏈接mysql及中文顯示問題

http://dev.mysql.com/downloads/connector/python/ python

Select Platform:選擇Platform Independent (Architecture Independent), Compressed TAR ,下載源碼mysql-connector-python-2.1.3.tar.gzmysql

tar xzvf mysql-connector-python-2.1.3.tar.gzlinux

cd mysql-connector-python-2.1.3/sql

sudo python3 setup.py install --with-mysql-capi=/opt/mysql(change to you mysqlserver path)shell

數據庫

sudo python setup.py install --with-mysql-capi=/opt/mysql(change to you mysqlserver path)api

通常說數據庫服務若是不是安裝在系統默認路徑下的狀況,須要下載源碼本身編譯驅動時指定對應的路徑,本人unixodbc是經過apt-get install來安裝的,所以安裝odbc的python驅動只需簡單的sudo pip3 install pyodbc便可。sqlserver

測試代碼:測試

import mysql.connector
conn = mysql.connector.connect(host='127.0.0.1', port=3306, user='your-user', passwd='your-passwd',
db='you-db')
cur = conn.cursor()
cur.execute("SET NAMES utf8")
cur.execute("SELECT * FROM you-table")
for r in cur.fetchall():
           print(r)
conn.close()

使用python3中文顯示正常、python2則顯示中文對應的utf-8代碼,這是由於python3和python2默認編碼格式不同。fetch

$ python
Python 2.7.6 (default, Jun 22 2015, 17:58:13) 
[GCC 4.8.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import sys
>>> sys.getdefaultencoding()
'ascii'
>>> quit()
$ python3
Python 3.4.3 (default, Oct 14 2015, 20:28:29) 
[GCC 4.8.4] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import sys
>>> sys.getdefaultencoding()
'utf-8'


對字符串類型能夠正常輸出、而對聚合類型(列表、元組 、字典等)不行、如改成如下代碼則python2能夠正常顯示中文了

aa=cur.execute("select * from you-table")
info = cur.fetchmany(aa)
for ii in info:
    print ii[0]+' '+ii[1]+' '+ii[2]+' '+ii[3]+......
conn.close()


或者

#得到表中有多少條數據
cur.execute("SET NAMES utf8")
aa=cur.execute("select * from you-table")
print aa

#打印表中的多少數據
info = cur.fetchmany(aa)
for tup in info:
    for ii in tup:
        print ii
cur.close()
conn.commit()
conn.close()

fetchmany獲得的是字符串的元組,總之要轉化成字符串之後再print中文就沒問題了

下面的例子對python2中文問題做了很好的說明:

$ python
Python 2.7.6 (default, Jun 22 2015, 17:58:13) 
[GCC 4.8.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> a = ['你好','哈哈','呵呵']
>>> print a
['\xe4\xbd\xa0\xe5\xa5\xbd', '\xe5\x93\x88\xe5\x93\x88', '\xe5\x91\xb5\xe5\x91\xb5']
>>> for m in a:
...     print m
... 
你好
哈哈
呵呵

更通用的寫法

import mysql.connector
import sys  

try:
    conn = mysql.connector.connect(host='127.0.0.1', port=3306, user='your-user', passwd='your-passwd',
    db='you-db')
    cur = conn.cursor()
    cur.execute("SELECT * FROM you-table")
    data = cur.fetchall()  
    for row in data:  
        for col in row:  
           print col,  #python3改成print (col, end=' ')
        print            #python3改成print()
except mysql.connector.Error AS e:  
    print ("Error %d: %s" % (e.args[0],e.args[1]))  
    sys.exit(1)  
finally:  
    if conn:  
        conn.close()

動態sql例子

建表的sql語句

CREATE TABLE `COURSE` (
  `CNO` char(6) NOT NULL,
  `CNAME` char(12) NOT NULL,
  `TEACHER` char(8) NOT NULL,
  `TIME` smallint(6) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

CREATE TABLE `STUDENT` (
  `SNO` char(7) NOT NULL,
  `SNAME` char(8) NOT NULL,
  `SEX` char(2) NOT NULL,
  `BDATE` date DEFAULT NULL,
  `DIR` char(16) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

CREATE TABLE `SC` (
  `SNO` char(7) NOT NULL,
  `CNO` char(6) NOT NULL,
  `GRADE` decimal(6,2) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

ALTER TABLE `COURSE`
  ADD PRIMARY KEY (`CNO`);
ALTER TABLE `STUDENT`
  ADD PRIMARY KEY (`SNO`);
ALTER TABLE `SC`
  ADD PRIMARY KEY (`SNO`,`CNO`),
  ADD KEY `CNO` (`CNO`);

ALTER TABLE `SC`
  ADD CONSTRAINT `SC_ibfk_1` FOREIGN KEY (`SNO`) REFERENCES `STUDENT` (`SNO`) ON DELETE CASCADE ON UPDATE NO ACTION,
  ADD CONSTRAINT `SC_ibfk_2` FOREIGN KEY (`CNO`) REFERENCES `COURSE` (`CNO`) ON UPDATE NO ACTION;
#coding=utf-8

import mysql.connector
conn = mysql.connector.connect(host='127.0.0.1', port=3306, user='your-user', passwd='your-passwd',
    db='you-db')
cur = conn.cursor()
#查詢成績大於88對應的學生和課程
sql = "SELECT SNAME,CNAME,GRADE FROM STUDENT \
    Inner JOIN SC ON STUDENT.SNO = SC.SNO \
    Inner JOIN COURSE ON COURSE.CNO = SC.CNO \
    WHERE GRADE > '%d'"
cur.execute(sql % (88))
data =  cur.fetchall()

#打印表中的多少數據
for row in data:
    for col in row:
        print col,
    print

conn.close()
相關文章
相關標籤/搜索