文字コードとの戦い(1)
sqlliteを扱っている時に生じたエラーと解決方の備忘録(Python2.7.5)
con = sqllite3.connect('dbfilename.db') con.text_factory = str # これを追加するだけ cur = con.cursor() ... ... cur.execute("""INSERT INTO hoge(foo,bar) VALUES(?,?)""",('ほげ','teehee') )
このDBに日本語などのASCII以外の文字をインサートすると,
<class 'sqlite3.ProgrammingError'>: You must not use 8-bit bytestrings unless you use a text_factory that can interpret 8-bit bytestrings (like text_factory = str). It is highly recommended that you instead just switch your application to Unicode strings.
このように怒られます. エンコードがutf-8の文字列を扱っていると良くエラーに衝突しますよね. そこで,今回はsqlite3を使った時に出てきたエラー(上記のエラー)の解決方法を紹介します. (実はエラーメッセージにどうしたら良いのかが書かれていますが,備忘録のため続けます)
まず当たり前だが,
# coding: utf-8
は文頭に付けておいてください.
はい.次に先程の問題はこれを追加するだけで解決出来ます.
con = sqllite3.connect('dbfilename.db') con.text_factory = str # これを追加するだけ cur = con.cursor() ... ...
pythonの公式ドキュメント にはtext_factoryについてこのように書かれています.
この属性を使って TEXT データ型をどのオブジェクトで返すかを制御できます。 デフォルトではこの属性は unicode に設定されており、 sqlite3 モジュールは TEXT を Unicode オブジェクトで返します。 もしバイト列で返したいならば、 str に設定してください。
この設定をすることで非ASCIIコード以外の文字列も扱う事が出来るようになります. python3.xではこのような問題は起きません(多分).そろそろpython3.xに移行したいです.