要看你的數(shù)據(jù)庫里存的是什么格式的,如果是unicode的話:
創(chuàng)新互聯(lián)建站是一家網(wǎng)站設(shè)計(jì)公司,集創(chuàng)意、互聯(lián)網(wǎng)應(yīng)用、軟件技術(shù)為一體的創(chuàng)意網(wǎng)站建設(shè)服務(wù)商,主營產(chǎn)品:響應(yīng)式網(wǎng)站、品牌網(wǎng)站設(shè)計(jì)、網(wǎng)絡(luò)營銷推廣。我們專注企業(yè)品牌在網(wǎng)站中的整體樹立,網(wǎng)絡(luò)互動的體驗(yàn),以及在手機(jī)等移動端的優(yōu)質(zhì)呈現(xiàn)。成都網(wǎng)站制作、做網(wǎng)站、外貿(mào)營銷網(wǎng)站建設(shè)、移動互聯(lián)產(chǎn)品、網(wǎng)絡(luò)運(yùn)營、VI設(shè)計(jì)、云產(chǎn)品.運(yùn)維為核心業(yè)務(wù)。為用戶提供一站式解決方案,我們深知市場的競爭激烈,認(rèn)真對待每位客戶,為客戶提供賞析悅目的作品,網(wǎng)站的價(jià)值服務(wù)。
sql="select * from t.branch where name='河南'".decode('utf8')
如果是gb系列編碼的話:
sql="select * from t.branch where name='河南'".decode('utf8').encode('gb18030')
以前用php連mssqy時(shí)也經(jīng)常出現(xiàn)中文亂碼(中文變問號)的問題,那時(shí)就明白是編碼沒設(shè)置好導(dǎo)航,現(xiàn)在的Python連mssql數(shù)據(jù)庫也同樣出現(xiàn)這問題,問題一樣,解決的辦法當(dāng)然也會相似,現(xiàn)在我們來看看解決方法。
python一直對中文支持的不好,最近老遇到編碼問題,而且?guī)缀鯖]有通用的方案來解決這個(gè)問題,但是對常見的方法都試過之后,發(fā)現(xiàn)還是可以解決的,下面總結(jié)了常用的支持中文的編碼問題(這些方法中可能其中一個(gè)就能解決問題,也可能是多個(gè)組合)。
(1)、首先,要保證文件的開頭要加上編碼設(shè)置來說明文件的編碼
代碼如下
復(fù)制代碼
#encoding=utf-8
(2)、然后,在連接數(shù)據(jù)的連接參數(shù)里加上字符集說明查詢出的結(jié)果的編碼,這個(gè)不加的后果可能是查詢出的漢字字符都是問號
代碼如下
復(fù)制代碼
conn=pymssql.connect(server='.',user='', password='',database='MyTest',charset='utf8')
(3)、設(shè)置python系統(tǒng)的默認(rèn)編碼(對于文件來說,這招幾乎屢試不爽,呵呵~~)
代碼如下
復(fù)制代碼
import sys
reload(sys)
sys.setdefaultencoding('utf8')
注意:上述編碼是“utf8”,而不是“utf-8”,我也沒弄明白,大部分情況下,這個(gè)無所謂的,但是這里我試了必須要是“utf8”
一個(gè)簡單的完整的python連接mssqlserver的例子如下(得安裝pymssql包):
代碼如下
復(fù)制代碼
#encoding:utf8
import sys
reload(sys)
sys.setdefaultencoding('utf8')
import pymssql
try:
conn=pymssql.connect(server='.',user='', password='',database='MyTest',charset='utf8')
sql="select * from UserInfo"
cur=conn.cursor()
cur.execute(sql)
data=cur.fetchall()
conn.close()
print data
except Exception,e:
print e
運(yùn)行結(jié)果如下:
代碼如下
復(fù)制代碼
[(u'20093501', u'xb9xf9xbexb8', u'u7537 ', 35, u'xb4xf3xcfxc0'),
(u'20093502', u'xbbxc6xc8xd8', u'u5973 ', 34, u'xc3xc0xc5xae'),
(u'20093503', u'xc1xeexbaxfcxb3xe5', u'u7537 ', 25, u'2Bxc7xe0xc4xea'),
(u'20093504', u'xc8xcexd3xafxd3xaf', u'u5973 ', 24, u'xc6xafxc1xc1')]
[Finished in 0.2s]
雖然擺脫了問號和亂碼的困擾,但這仍不是我們想要的結(jié)果,但這個(gè)確實(shí)是正確的,因?yàn)榻Y(jié)果是utf8編碼。這個(gè)現(xiàn)象確實(shí)詭異,請教了許多高手,得知,最好的結(jié)果就是逐個(gè)字段查詢,才能顯示中文,整個(gè)查詢的話,會以utf8的格式顯示出來。
上述代碼中第14行data是整個(gè)查詢的結(jié)果,如果指定某個(gè)具體的字段,如print data[0][2](表示取查詢結(jié)果的第一行第三列的字段的值),則會輸出中文。
其實(shí)不僅僅是mssqlserver數(shù)據(jù)庫,mysql(需下載MySQLdb包)、sqllite(python自帶的文件數(shù)據(jù)庫)、mongodb(需下載PyMongo包)等或者是普通文本文件也是類似的解決方案。
哦。如果真的存在這樣的問題,可能有幾個(gè)方面。
一個(gè)是網(wǎng)絡(luò)環(huán)境本身不好。甚至還有網(wǎng)絡(luò)防火墻。
第二個(gè)原因可能是sqlserver2005自身的配置。關(guān)于長鏈接的維持,會話失效時(shí)間的設(shè)置。
第三個(gè)原因是所用的驅(qū)動程序。我印象中有幾種。我在linux上用了一種很穩(wěn)定,連接sql server一直沒有發(fā)現(xiàn)問題。我是直接驅(qū)動的。沒有經(jīng)過django。
第四,你在django訪問的時(shí)候,如果發(fā)現(xiàn)連接錯誤,可以要求數(shù)據(jù)重新連接。這個(gè)以前我似乎配置過,幾年不用了。
第五,可能與你采集的數(shù)據(jù)有關(guān)。你的數(shù)據(jù)中是否存在數(shù)據(jù)太大。下載時(shí)間過長。以及不合法數(shù)據(jù)。這些也可能導(dǎo)致django出錯。顯示為連接失敗。估計(jì)是數(shù)據(jù)錯誤。
需要使用xlrd和MySQLdb庫,可自行百度下載。
#coding:utf-8
import xlrd
import MySQLdb
data=xlrd.open_workbook(r'F:\test\baseParam.xls') #讀取表格db="測試" #需要操作的數(shù)據(jù)庫
conn= MySQLdb.connect(
host='localhost',
port = 3306,
user='root',
passwd='123456',
charset='utf8'
) #連接mysql
cur=conn.cursor()
cur.execute("drop database if exists "+db)cur.execute("create database "+db)
conn.select_db(db) #初始化數(shù)據(jù)庫
sheet_names=data.sheet_names()
for sheet_name in sheet_names:
sheet=data.sheet_by_name(sheet_name)
row_data=sheet.row_values(0)
row_data=' varchar(256) DEFAULT NULL, '.join(row_data)row_data=row_data+' varchar(256) DEFAULT NULL'
cur.execute('create table '+sheet_name+'('+row_data+')') #數(shù)據(jù)庫中創(chuàng)建表格ss=''
for index in range(sheet.ncols):
ss=ss+'%s, '
ss=ss.rstrip(', ')
sql="insert "+ sheet_name+ " values(" +ss +")"param=[]
for index in range(1,sheet.nrows):
row_values=sheet.row_values(index)
param.append(row_values)
cur.executemany(sql,param) #插入數(shù)據(jù)
conn.commit()
cur.close()
conn.close() #釋放數(shù)據(jù)連接
MySQLdb.connect是python 連接MySQL數(shù)據(jù)庫的方法,在Python中 import MySQLdb即可使用,至于connect中的參數(shù)很簡單:\x0d\x0ahost:MySQL服務(wù)器名\x0d\x0auser:數(shù)據(jù)庫使用者\(yùn)x0d\x0apassword:用戶登錄密碼\x0d\x0adb:操作的數(shù)據(jù)庫名\x0d\x0acharset:使用的字符集(一般是gb2312)\x0d\x0acursor = db.cursor() 其實(shí)就是用來獲得python執(zhí)行Mysql命令的方法,也就是\x0d\x0a我們所說的操作游標(biāo)\x0d\x0a下面cursor.execute則是真正執(zhí)行MySQL語句,即查詢TABLE_PARAMS表的數(shù)據(jù)。\x0d\x0a至于fetchall()則是接收全部的返回結(jié)果行 row就是在python中定義的一個(gè)變量,用來接收返回結(jié)果行的每行數(shù)據(jù)。同樣后面的r也是一個(gè)變量,用來接收row中的每個(gè)字符,如果寫成C的形式就更好理解了\x0d\x0afor(string row = ''; row
回答于?2022-11-16
真巧,剛剛做過,鏈接的也是MSSQL2014的數(shù)據(jù)庫,并且測試是成功的
import?pymssql
conn=pymssql.connect(host='主機(jī)名或IP',user='數(shù)據(jù)庫用戶名',password='數(shù)據(jù)庫用戶密碼',database='數(shù)據(jù)庫名',charset='utf8')
cursor?=conn.cursor()
if?not?cursor:
raise(NameError,"連接數(shù)據(jù)庫失敗")
strsql="select?*?from?表"
try:
cursor.execute(strsql)?#執(zhí)行SQL語句
conn.commit()?#修改數(shù)據(jù)后提交事務(wù)
except:
print(0,"錯誤:"+strsql)
pass
finally:
print(l,"成功!")
pass
cursor.close()?#關(guān)閉對象
conn.close()?#關(guān)閉數(shù)據(jù)庫連接
import pymssql?這句話必須有,主要是pymssql?必須要安裝上,可以使用pip list來查看是否安裝
網(wǎng)站名稱:包含python連接sqlserver數(shù)據(jù)庫的詞條
文章轉(zhuǎn)載:http://jinyejixie.com/article14/dssegge.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供Google、ChatGPT、軟件開發(fā)、靜態(tài)網(wǎng)站、網(wǎng)站營銷、外貿(mào)網(wǎng)站建設(shè)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)