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の中身をそのまま受け取れる