sqlite3の文字コード関連
#!/usr/bin/python # -*- coding: utf-8 -*- import sqlite3 con = sqlite3.connect(":memory:") cur = con.cursor() # Create the table cur.execute("create table test(hoge TEXT)") #unicodeを入力 cur.execute("insert into test values (?)", (u"unicode:ほげ",)) #utf-8を入力 cur.execute("insert into test values (?)", (u"utf-8:ほげ".encode("utf-8"),)) #mbcsを入力 cur.execute("insert into test values (?)", (u"mbcs:ほげ".encode("mbcs"),)) #出力をstrで con.text_factory = str cur.execute("select hoge from test") for row in cur.fetchall(): print row #出力をunicodeで con.text_factory = unicode cur.execute("select hoge from test") for row in cur.fetchall(): #※mbcsの型変換処理で落ちる print row
以下出力結果
('unicode:\xe3\x81\xbb\xe3\x81\x92',) ('utf-8:\xe3\x81\xbb\xe3\x81\x92',) ('mbcs:\x82\xd9\x82\xb0',) Traceback (most recent call last): File "<stdin>", line 30, in <module> sqlite3.OperationalError: Could not decode to UTF-8 column 'hoge' with text 'mbcs:ほげ'
結果から想像されることは
unicodeオブジェクトをinsertするとはutf-8に変換されてDBに格納される
strオブジェクトはstrオブジェクトのまま格納される
con.text_factory = unicodeを設定している場合(デフォルト設定)
sqlite3はstrオブジェクトがutf-8という前提でunicode変換を行うので
strオブジェクトがutf-8以外ならデコードエラーが起こる
con.text_factory = strを設定している場合
strの中身をそのまま受け取れる