Python调用MySQLdb插入中文乱码的解决

Ryan
Ryan
发布时间:2026-10-16| 5人浏览过
原创

本文详解Python使用MySQLdb库插入中文数据时出现的乱码及数据未保存问题。通过设置连接参数charset为utf-8,并在插入前对字符串进行gbk到utf-8的编码转换,可有效解决乱码。同时强调执行插入语句后必须调用conn.commit()提交事务,否则断开连接后数据不会持久化。

MySQLdb插入中文乱码

#!/usr/bin/python
# -*- coding: utf-8 -*-
 
import MySQLdb
def main():
    fullname = "赵钱孙李"
 
    conn = MySQLdb.connect(host='localhost', user='root',passwd='123', db='account', charset='utf8')  # OK
    #conn = MySQLdb.connect(host='localhost', user='root',passwd='123', db='account')  # Error!!!
    cursor = conn.cursor()
    cursor.execute("insert into account (username,password) values ('%s','%s')" % (fullname, "111"))
    conn.commit()
    cursor.close()
    conn.close()
 
if __name__ == "__main__":
    main()

若从终端查询数据库发现中文显示为乱码,需在连接时指定charset参数(前提是数据库和表均使用utf-8编码)。

若不指定,默认插入的字符编码可能是latin-1(此时若执行fullname.decode('utf8')会报错)。

此外,将从数据库读取的中文输出到网页时若无内容显示,可添加以下代码解决:

import sys
reload(sys)
sys.setdefaultencoding('utf-8')

Python内部处理编码默认为ascii:

print sys.getdefaultencoding()

MySQLdb使用utf-8 编码插入中文数据

近期开发了一个从网页抓取股票信息并存入MySQL的程序。

使用环境

  • Python 2.5 for Windows
  • MySQLdb 1.2.2 for Python 2.5
  • MySQL 4.1.22

开发过程中遇到了一些异常故障。

第一个问题:插入中文失败

该问题由字符编码引起。MySQL安装时已设置为utf8编码,建表时也使用了utf8编码。程序中需在开头声明#-*- coding: utf-8 -*-,并在建立连接字符串时明确指定使用utf8,例如conn=MySQLdb.connect(host="127.0.0.1",user="webdb",passwd="web123",db="web",charset="utf8")。

设置完成后,从MySQL取出的以utf8编码保存的中文不再出现乱码。

对于中文字符串,如:a = "浦发银行",在插入前需进行编码转换a = a.decode("gbk").encode("utf-8")。随后执行插入操作即可正常处理。

第二个问题:能插入之后无法在MySQL中保存刚才插入的数据

经检查,数据能正确插入,但连接断开后表中未保存。原因是漏调用了conn.commit()。必须在语句执行后提交操作。

源代码如下:

 # -*- coding: utf-8 -*-
 import  sys,MySQLdb
conn = MySQLdb.connect(host = " 127.0.0.1 " ,user = " webdb " ,passwd = " web123 " ,db = " web " ,charset = " utf8 " )     # 需要设定一下charset为utf-8
 cursor = conn.cursor()     # 生成连接的指针对象
 # 进行字符串编码转换并进行插入
 a  =   " 浦发银行 "
a  =  a.decode( " gbk " ).encode( " utf-8 " )     # 编码转换为utf-8
 sql = " insert into stocklist (stockno,stockname) values (%s,%s) "      # 生成sql语句
 param = ( ' 600000 ' ,a)     # 生成sql语句的参数
 n  =  cursor.execute(sql,param)     # 执行sql语句
# 以上操作等价于n = cursor.execute("insert into stocklist (stockno,stockname) values ('430004','"+ "浦发银行".decode("gbk").encode("utf-8") + "')")
 print  n
conn.commit()  # 提交操作结果
 # 进行查询操作检查刚刚执行的插入操作结果
 n  =  cursor.execute( " select * from stocklist " )
 for  row  in  cursor.fetchall():
     print  row[0]  +  row[ 1 ]
cursor.close()     # 关闭指针
 conn.close()     # 关闭连接

以上为个人经验,希望能给大家一个参考,也希望大家多多支持本站。

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。