python 中,使用 pymysql 对表进行增改删等变更操作时,报错 UnicodeEncodeError: 'latin-1' codec can't encode characters in position 2-5: ordinal not in range(256),原因及解决方法?
原因及解决方法
原因
操作表的字段里面有 utf8、utf8mb4 等非 latin-1 的编码方式,pymysql 默认对数据库采用 latin-1 的编码形式。
解决方法
如果没有用连接池,需要创建连接对象时需要指定相应 db 操作的 charset 参数为实际的编码方式:
import pymysql
def connect_db():
    return pymysql.connect(
        host='x.x.x.x',
        port=3306,
        user='xxxx',
        password='xxx',
        database='xx',
        charset='utf8'
    )
如果使用诸如 DBUtils 的连接池,示例如下:
import pymysql
from DBUtils.PooledDB import PooledDB
def connect_db():
    pool = PooledDB(pymysql, mincached=5, maxcached=10, maxconnections=50,
                    host='x.x.x.x', user='xxxx', passwd='xxx',
                    port=3306, db='xx', charset='utf8')
    return pool.connection()