Python連接SQLServer之UnicodeDecodeError:'gbk'codec can't decode

緣由:由于工作原因呜叫,需要從SQLServer數(shù)據(jù)庫(kù)中同步一部分?jǐn)?shù)據(jù)到mongodb中帐要,用于建模,運(yùn)算落塑。

開(kāi)發(fā)環(huán)境:Windows纽疟,Python3.5.2
開(kāi)發(fā)工具:pycharm2017.1.4
連接SQLServer所用module:pymssql
目標(biāo)數(shù)據(jù)庫(kù)版本:SQLServer2008 編碼為GBK

具體情況:
開(kāi)始連接數(shù)據(jù)庫(kù)的代碼如下

    # 連接數(shù)據(jù)庫(kù),獲取游標(biāo)
    @staticmethod
    def get_sql_connect(host, user, password, database, charset):
        if host is None or user is None or password is None or database is None:
            raise ConnectionError('連接數(shù)據(jù)庫(kù)的必要參數(shù)為空')
        if charset is None:
            charset = 'utf8'
        sql_conn = pymssql.connect(
            host=host,
            user=user,
            password=password,
            database=database,
            charset=charset
        )
        return sql_conn

conn = SynchronizeData.get_sql_connect('.', 'sa', '712604', 'test', 'GB18030')

這里在連接的時(shí)候傳入charset='GBK'憾赁,因?yàn)槟繕?biāo)數(shù)據(jù)庫(kù)編碼是GBK仰挣,在python中如果不帶這個(gè)參數(shù)那么查詢(xún)出來(lái)的中文將會(huì)顯示亂碼。帶上這個(gè)參數(shù)之后一切看起來(lái)沒(méi)毛病缠沈,在執(zhí)行了一段時(shí)間之后發(fā)現(xiàn)會(huì)出現(xiàn)UnicodeDecodeError:'gbk'codec can't decode byte 0x81 in position 18:illegal multibyte sequen這樣的異常膘壶。當(dāng)時(shí)也google了好久错蝴,后來(lái)找了個(gè)靠譜的方案說(shuō)是因?yàn)镚BK的字符不多,于是把GBK換成了GB18030問(wèn)題得到解決颓芭。

但是在導(dǎo)入某個(gè)表的時(shí)候發(fā)現(xiàn)此時(shí)GB18030也報(bào)了上面類(lèi)似的異常顷锰。定位到數(shù)據(jù)以后該字段的類(lèi)型類(lèi)text,里面存儲(chǔ)的是一篇文章,初步估計(jì)是里面的內(nèi)容在python中查詢(xún)之后轉(zhuǎn)Unicode發(fā)生了莫名其妙的錯(cuò)誤亡问。此時(shí)繼續(xù)在google上搜索官紫,絕大部分說(shuō)這個(gè)異常的情況都是在python中打開(kāi)文件,然后解決辦法是在打開(kāi)文件的代碼中加上coding='utf-8',然而我在連接數(shù)據(jù)庫(kù)的時(shí)候不過(guò)不帶charset這個(gè)參數(shù)就會(huì)發(fā)生中文亂碼州藕,帶了吧束世,就會(huì)發(fā)生那個(gè)異常。本來(lái)都打算把數(shù)據(jù)導(dǎo)出成excel床玻,然后通過(guò)mongodbimport去導(dǎo)入了毁涉,奈何數(shù)據(jù)量有點(diǎn)大,昨天這個(gè)導(dǎo)出的過(guò)程持續(xù)了一天也不過(guò)導(dǎo)出了一半不到的數(shù)據(jù)锈死。

今天早上到公司的時(shí)候不死心的又在看這個(gè)問(wèn)題贫堰。忽然想試下把該字段的類(lèi)型改成ntext的形式不知道行不行。(SQLServer中有varchar和nvarchar待牵,text和ntext之分其屏,不知道的請(qǐng)另行百度)。把字段的類(lèi)型改了還是繼續(xù)采用上面的連接缨该,發(fā)現(xiàn)代碼是不報(bào)錯(cuò)了偎行,但是該字段中的所有中文卻消失了,只留下了數(shù)字和符號(hào)贰拿。這很顯然又不行的睦优,于是我試驗(yàn)了下面的代碼
# 連接數(shù)據(jù)庫(kù),獲取游標(biāo)
@staticmethod
def get_sql_connect(host, user, password, database):
if host is None or user is None or password is None or database is None:
raise ConnectionError('連接數(shù)據(jù)庫(kù)的必要參數(shù)為空')
sql_conn = pymssql.connect(
host=host,
user=user,
password=password,
database=database
)
return sql_conn
conn = SynchronizeData.get_sql_connect('.', 'sa', '712604', 'test')

激動(dòng)人心的事情發(fā)生了:中文不亂碼了壮不,而且字段中的內(nèi)容也沒(méi)丟失。問(wèn)題到這里似乎就可以解決了皱碘。接下來(lái)的情況就因人而異了:
在修改表字段的時(shí)候發(fā)現(xiàn)有的字段有索引询一,導(dǎo)致修改類(lèi)型失敗。于是問(wèn)題轉(zhuǎn)變成能不能在查詢(xún)的時(shí)候把類(lèi)型給替換掉癌椿。很顯然SQLserver還是可以完成這樣的功能的: CAST()
于是把我查詢(xún)的select * from table 改成 select cast(中文內(nèi)容的字段 as ntext) from table (如果該字段是varchar則 as后面是 nvarchar)健蕊,問(wèn)題到這才算完美解決

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市踢俄,隨后出現(xiàn)的幾起案子缩功,更是在濱河造成了極大的恐慌,老刑警劉巖都办,帶你破解...
    沈念sama閱讀 218,204評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件嫡锌,死亡現(xiàn)場(chǎng)離奇詭異虑稼,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)势木,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,091評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)蛛倦,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)债朵,“玉大人后专,你說(shuō)我怎么就攤上這事∑越迹” “怎么了甫男?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,548評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵且改,是天一觀(guān)的道長(zhǎng)。 經(jīng)常有香客問(wèn)我板驳,道長(zhǎng)又跛,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,657評(píng)論 1 293
  • 正文 為了忘掉前任笋庄,我火速辦了婚禮效扫,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘直砂。我一直安慰自己菌仁,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,689評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布静暂。 她就那樣靜靜地躺著济丘,像睡著了一般。 火紅的嫁衣襯著肌膚如雪洽蛀。 梳的紋絲不亂的頭發(fā)上摹迷,一...
    開(kāi)封第一講書(shū)人閱讀 51,554評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音郊供,去河邊找鬼峡碉。 笑死,一個(gè)胖子當(dāng)著我的面吹牛驮审,可吹牛的內(nèi)容都是我干的鲫寄。 我是一名探鬼主播,決...
    沈念sama閱讀 40,302評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼疯淫,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼地来!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起熙掺,我...
    開(kāi)封第一講書(shū)人閱讀 39,216評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤未斑,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后币绩,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體蜡秽,經(jīng)...
    沈念sama閱讀 45,661評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡府阀,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,851評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了载城。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片肌似。...
    茶點(diǎn)故事閱讀 39,977評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖诉瓦,靈堂內(nèi)的尸體忽然破棺而出川队,到底是詐尸還是另有隱情,我是刑警寧澤睬澡,帶...
    沈念sama閱讀 35,697評(píng)論 5 347
  • 正文 年R本政府宣布固额,位于F島的核電站,受9級(jí)特大地震影響煞聪,放射性物質(zhì)發(fā)生泄漏斗躏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,306評(píng)論 3 330
  • 文/蒙蒙 一昔脯、第九天 我趴在偏房一處隱蔽的房頂上張望啄糙。 院中可真熱鬧,春花似錦云稚、人聲如沸隧饼。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,898評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)燕雁。三九已至,卻和暖如春鲸拥,著一層夾襖步出監(jiān)牢的瞬間拐格,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,019評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工刑赶, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留捏浊,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,138評(píng)論 3 370
  • 正文 我出身青樓撞叨,卻偏偏與公主長(zhǎng)得像金踪,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子谒所,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,927評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • 1、引言 數(shù)據(jù)庫(kù)設(shè)計(jì)過(guò)程中表沛申、字段等的命名規(guī)范也算是設(shè)計(jì)規(guī)范的一部分劣领,不過(guò)設(shè)計(jì)規(guī)范更多的是為了確保數(shù)據(jù)庫(kù)設(shè)計(jì)的合理...
    SnowflakeCloud閱讀 40,998評(píng)論 0 48
  • 語(yǔ) 句 功 能 數(shù)據(jù)操作 SELECT——從數(shù)據(jù)庫(kù)表中檢索數(shù)據(jù)行和列INSERT——向數(shù)據(jù)庫(kù)表添加新數(shù)據(jù)行DELE...
    戰(zhàn)敭閱讀 5,093評(píng)論 0 53
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語(yǔ)法,類(lèi)相關(guān)的語(yǔ)法铁材,內(nèi)部類(lèi)的語(yǔ)法尖淘,繼承相關(guān)的語(yǔ)法奕锌,異常的語(yǔ)法,線(xiàn)程的語(yǔ)...
    子非魚(yú)_t_閱讀 31,631評(píng)論 18 399
  • 桂花姑娘村生, 邁著小碎步走來(lái)時(shí)惊暴, 星星溫柔的擁抱她, 明月深情的吻她趁桃, 露珠兒捧出真心給她辽话。 桂花姑娘, 微笑著起舞...
    君兮閱讀 290評(píng)論 18 11
  • “網(wǎng)紅經(jīng)濟(jì)”作為一種新興的經(jīng)濟(jì)形式卫病,伴隨著互聯(lián)網(wǎng)的普及油啤,在中國(guó)呈現(xiàn)出爆發(fā)式增長(zhǎng)的態(tài)勢(shì)。就目前來(lái)看蟀苛,網(wǎng)絡(luò)經(jīng)濟(jì)都是以網(wǎng)...
    深色的藍(lán)閱讀 978評(píng)論 0 2