zoukankan      html  css  js  c++  java
  • ProgrammingError: You must not use 8-bit bytestrings...

    问题出现:

    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.

    产生原因:

    问题在用Python的sqlite3操作数据库要插入的字符串中含有非ascii字符时产生,做插入的时候就报当前这个错误。

    解决方法:

    1. 按提示

    connection = sqlite3.connect(...)
    connection.text_factory = str
    

    但是如果字符中出现非ascii字符,那么依然不能解决问题,会产生不可预知的乱码,这样可以参考 2

    2. 以utf8的编码格式进行解码转为unicode编码做插入

    cursor.execute('''
        INSERT INTO JAVBUS_DATA (姓名, 年龄)
        VALUES (?, ?)
        ''', ('张三'.decode('utf-8'), '22岁'.decode('utf-8')))
    

    但是如果数据太长,这样一个一个敲挺麻烦的,下面是一个使用map函数简化的小例子

    #-*-coding:utf-8-*-
    import sqlite3
    
    def decode_utf8(aStr):
        return aStr.decode('utf-8')
    
    conn = sqlite3.connect("something.db")
    cursor = conn.cursor()
    
    cursor.execute('''
        CREATE TABLE IF NOT EXISTS JAVBUS_DATA(
            id       INT PRIMARY KEY,
            姓名     TEXT,
            年龄     TEXT);''')
    print "Table created successfully"
    cursor.execute('''
        INSERT INTO JAVBUS_DATA (姓名, 年龄)
        VALUES (?, ?)
        ''', map(decode_utf8, ('张三', '22岁')))
    
    cursor.close()
    conn.commit()
    conn.close()
    

    其他注意:

    有时用第二种方法会出现UnicodeDecodeError
    加入#--coding:utf-8--
    还是不行请sys指定编码:

    import sys  
    reload(sys)  
    sys.setdefaultencoding('utf8') 
    

    这个问题在python3应该不会出现,python2编码问题,仅作记录

  • 相关阅读:
    20145127 《Java程序设计》第一周学习总结
    Java 问卷调查
    一个没有成就而即将退赛的OIer的告别书
    【深度优先搜索】MZOJ_1344工作依赖
    【算法随笔】最小生成树
    【数据结构】二叉树 学习笔记1
    【深度优先搜索】NOIP2017_D2T1 洛谷3958奶酪
    【树形DP】MZOJ_1063_士兵守卫
    【算法随笔】写一个自己的名词空间
    【树形DP】洛谷1122_最大子树和
  • 原文地址:https://www.cnblogs.com/Akkuman/p/6959278.html
Copyright © 2011-2022 走看看