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()