關(guān)于編碼問題的一個有趣的案例

最近在工作中遇到一個問題冀膝,其實(shí)是自己給自己挖了一個坑,并且還義無反顧的跳了進(jìn)去,問題描述:
在python(python 2.X) 執(zhí)行postgresql 數(shù)據(jù)插入的時候揍堕,出現(xiàn)下面這樣的情況:

中文顯示問題.png

其實(shí)我的postgresql 得字符編碼格式設(shè)置的是沒問題的,具體執(zhí)行

客戶端編碼格式.png
查看postgresql編碼格式.png

那一定是執(zhí)行插入數(shù)據(jù)的語句出了問題,查看了一下自己的插入數(shù)據(jù)命令:

    def insert_tale(self, tablename, field_list, data):
        self.connect_db()
        cur = self.connect_db().cursor()
        filed_str = '('+'%s, '*(len(field_list)-1) + '%s' +')'
        filed_str = filed_str%tuple(field_list)
        for i in data:
            if isinstance(i, unicode):
                data[data.index(i)] = i.encode('utf8')
        values_ = tuple(data)
        sql_ = u"insert into %s %s values %s;" % (tablename, filed_str, values_)
        cur.execute(sql_)
        self.commit_db()

好像也沒什么問題汤纸,重新調(diào)整了一下實(shí)現(xiàn)方式衩茸,如下是可以正常插入中文, 并可正常顯示成中文的代碼實(shí)現(xiàn)

    def insert_tale(self, tablename, field_list, data):
        self.connect_db()
        cur = self.connect_db().cursor()
        filed_str = '('+'%s, '*(len(field_list)-1) + '%s' +')'
        filed_str = filed_str%tuple(field_list)
        for i in data:
            if isinstance(i, int):
                data[data.index(i)] = str(i)
        values_ = "'" + "', '".join(data) + "'"
        sql_ = u"insert into %s %s values (%s);" % (tablename, filed_str, values_)
        cur.execute(sql_)
        self.commit_db()

具體的差別贮泞,可以看到楞慈,就是在問題代碼中,使用的list轉(zhuǎn)tuple的tuple方法啃擦,而在正常代碼中使用的是字符串的操作方式囊蓝。
兩者具體啥區(qū)別呢,舉幾個例子來觀察現(xiàn)象:

image.png
從這個例子中可以看到問題的所在.png

同樣是unicode編碼议惰,放在列表或者字符串后通過格式化字符串進(jìn)行轉(zhuǎn)義就不一樣了

image.png

這就是為什么在執(zhí)行insert操作的時候慎颗,如果不進(jìn)行encode轉(zhuǎn)義就會報TypeError錯誤,因?yàn)樵趕ql語句中會出現(xiàn)這樣的形式
insert into test (id, name, age, addr, phone) values (1, u"\u8fd9\u662f", 12, u"\u6d4b\u8bd5\u4ee3\u7801", '1234567890');
這是postgresql所不允許的言询。
而轉(zhuǎn)為utf-8格式后插入就會出現(xiàn)最上面圖中的數(shù)據(jù)格式俯萎,所以,在字符串轉(zhuǎn)義的時候一定要注意的就是
不要轉(zhuǎn)義list或者tuple格式的數(shù)據(jù)运杭,如果在像insert語句那樣需要(.....)的夫啊,記住(....)放在字符串中來構(gòu)建,轉(zhuǎn)義的時候辆憔,盡量只轉(zhuǎn)義字符串撇眯,數(shù)字等基本格式的數(shù)據(jù)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市虱咧,隨后出現(xiàn)的幾起案子熊榛,更是在濱河造成了極大的恐慌,老刑警劉巖腕巡,帶你破解...
    沈念sama閱讀 211,123評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件玄坦,死亡現(xiàn)場離奇詭異,居然都是意外死亡绘沉,警方通過查閱死者的電腦和手機(jī)煎楣,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,031評論 2 384
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來车伞,“玉大人择懂,你說我怎么就攤上這事×砭粒” “怎么了困曙?”我有些...
    開封第一講書人閱讀 156,723評論 0 345
  • 文/不壞的土叔 我叫張陵表伦,是天一觀的道長。 經(jīng)常有香客問我赂弓,道長绑榴,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,357評論 1 283
  • 正文 為了忘掉前任盈魁,我火速辦了婚禮翔怎,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘杨耙。我一直安慰自己赤套,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,412評論 5 384
  • 文/花漫 我一把揭開白布珊膜。 她就那樣靜靜地躺著容握,像睡著了一般。 火紅的嫁衣襯著肌膚如雪车柠。 梳的紋絲不亂的頭發(fā)上剔氏,一...
    開封第一講書人閱讀 49,760評論 1 289
  • 那天,我揣著相機(jī)與錄音竹祷,去河邊找鬼谈跛。 笑死,一個胖子當(dāng)著我的面吹牛塑陵,可吹牛的內(nèi)容都是我干的感憾。 我是一名探鬼主播,決...
    沈念sama閱讀 38,904評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼令花,長吁一口氣:“原來是場噩夢啊……” “哼阻桅!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起兼都,我...
    開封第一講書人閱讀 37,672評論 0 266
  • 序言:老撾萬榮一對情侶失蹤嫂沉,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后扮碧,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體趟章,經(jīng)...
    沈念sama閱讀 44,118評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,456評論 2 325
  • 正文 我和宋清朗相戀三年芬萍,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片搔啊。...
    茶點(diǎn)故事閱讀 38,599評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡柬祠,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出负芋,到底是詐尸還是另有隱情漫蛔,我是刑警寧澤嗜愈,帶...
    沈念sama閱讀 34,264評論 4 328
  • 正文 年R本政府宣布,位于F島的核電站莽龟,受9級特大地震影響蠕嫁,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜毯盈,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,857評論 3 312
  • 文/蒙蒙 一剃毒、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧搂赋,春花似錦赘阀、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,731評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至宋欺,卻和暖如春轰豆,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背齿诞。 一陣腳步聲響...
    開封第一講書人閱讀 31,956評論 1 264
  • 我被黑心中介騙來泰國打工酸休, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人掌挚。 一個月前我還...
    沈念sama閱讀 46,286評論 2 360
  • 正文 我出身青樓雨席,卻偏偏與公主長得像,于是被迫代替她去往敵國和親吠式。 傳聞我的和親對象是個殘疾皇子陡厘,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,465評論 2 348

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

  • 1. 簡介 1.1 什么是 MyBatis ? MyBatis 是支持定制化 SQL特占、存儲過程以及高級映射的優(yōu)秀的...
    笨鳥慢飛閱讀 5,453評論 0 4
  • 一糙置、python 變量和數(shù)據(jù)類型 1.整數(shù) Python可以處理任意大小的整數(shù),當(dāng)然包括負(fù)整數(shù)是目,在Python程序...
    績重KF閱讀 1,658評論 0 1
  • 最近在慕課網(wǎng)學(xué)習(xí)廖雪峰老師的Python進(jìn)階課程谤饭,做筆記總結(jié)一下重點(diǎn)。 基本變量及其類型 變量 在Python中懊纳,...
    victorsungo閱讀 1,667評論 0 5
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法揉抵,類相關(guān)的語法,內(nèi)部類的語法嗤疯,繼承相關(guān)的語法冤今,異常的語法,線程的語...
    子非魚_t_閱讀 31,598評論 18 399
  • 聽聽他們怎么說 老譚:套路:工于心計屋谭,立竿見影。真誠:需要時間的沉淀與檢驗(yàn)龟糕。不過桐磁,套路別人我覺得容易把自己套路進(jìn)去...
    幼稚了一半的成熟鬼閱讀 193評論 6 0