pysqliteはutf8以外でエラーになる?
みんなのPython で、pysqliteを使ったサンプルコード*1がある。これをShift_JISで動かしてやる
#coding=shift_jis import sqlite3 #郵便番号 postnum = [ ["東京都千代田区", "100-0000"], ["東京都千代田区皇居外苑", "100-0001"], ["東京都千代田区飯田橋", "102-0072"], ["東京都千代田区一番町", "102-1082"], ["東京都千代田区岩本町", "103-0032"], ] #コネクションを作る con = sqlite3.connect(":memory:") cur = con.cursor() #テーブル作成 cur.execute( """CREATE TABLE postdb( adress text, postno text)""" ) #登録 for item in postnum: cur.execute(""" INSERT INTO postdb ( adress, postno ) VALUES ( ?, ?) """, item) cur.execute( "SELECT * FROM postdb WHERE postno = ?", ("102-0072",)) data = cur.fetchone() print data
エンコードをShift_JISで統一してるんだから当然動きそうなのである。ところがエラーになる。
Traceback (most recent call last): File "C:\sql.py", line 23, in <module> cur.execute( "SELECT * FROM postdb WHERE postno = ?", ("102-0072",)) sqlite3.OperationalError: Could not decode to UTF-8 column 'adress' with text '東京都千代田区飯田橋'
sqliteが返した結果をUTF-8に変換できませんってエラーっぽい。内部エンコードに変換できなくてエラー。エラーをキャッチして、エンコードを指定してやろうにも、モジュールいじらないと駄目っぽい。どうすればいい?教えて、Pythonの偉い人。
そりゃ。まぁ、ソースをUnicode使うようにしたらエラー無く進むのね。
#..省略 #郵便番号 postnum = [ [u"東京都千代田区", "100-0000"], [u"東京都千代田区皇居外苑", "100-0001"], [u"東京都千代田区飯田橋", "102-0072"], [u"東京都千代田区一番町", "102-1082"], [u"東京都千代田区岩本町", "103-0032"], ] #..省略 print data[0].encode("shift_jis")
これだと、Shift_JISつかってるわけじゃなく、Unicodeでプログラムしてるから、やりたいことがちょっと違う。それにencodeメソッドが美しくない。