`

python mysqldb连接数据库编码

阅读更多

来源:

http://blog.donews.com/maverick/archive/2006/08/23/1012040.aspx

 

 

Python连接MySQL时需要用到  MySQLdb ,按照给出的例子,操作MySQL的代码大致如下:

""" Python to MySQL using mysql-python"""
import MySQLdb

# Establich a connection
conn = MySQLdb.connection(host="192.168.200.66",
                user="trainee",
                passwd="abc123",
                port=3306,
                db="forsale")

# Run a MySQL query from Python and get the result set
cursor = conn.cursor()
sql = ’select version();’
cursor.execute(sql)
result = cursor.fetchall()
print result[0][0]
cursor.close()
conn.close()

不过,在执行一些包含UTF8字符的SQL语句时,往往会见到这样的错误:
‘ascii’ codec can’t encode character ……’
或者
‘latin-1′ codec can’t encode character ……’
这种情况下,即使在py文件的头部加上
# -*- coding: utf-8 -*-
并且在连接语句中加上两个参数use_unicode和charset
conn = MySQLdb.connection(host="192.168.200.66",
                user="trainee",
                passwd="abc123",
                port=3306,
                db="forsale",
                use_unicode=True,
                charset="utf-8")
也无济于事

问题的根源似乎在于,MySQLdb的cursor在执行execute操作时,运行了如下代码(cursor.py第146行):
        charset = db.character_set_name()
        query = query.encode(charset)
我发现,无论怎么指定编码,db.character_set_name()获得的,似乎都是latin-1或者ascii(与报错语句提示的Codec一致),这样的codec当然无法编码UTF-8的字符了。
db.character_set_names()到底在哪里设置的,我跟了许久也无从知道,即使这样,还是有办法解决这个问题:
1.在query = query.encode(charset)直接加上一句charset = "utf-8"
这是最笨的方法,改动最小的权宜之计,硬编码,只能应付UTF-8的SQL情况;
2.修改cursor的execute函数,增加一个char参数。
原来的execute是这样定义的:
    def execute(self, query, args=None):
修改之后为
    def execute(self, query, char="utf-8", args=None):
然后将
        charset = db.character_set_name()
        query = query.encode(charset)
改为
        charset = char
        query = query.encode(charset)
此后如果要执行包含GBK字符的SQL语句,只要在调用execute函数时增加设定char="GBK" ,就可以了。


4条评论

  1. 我也碰到这个问题了。现在只是在windows上调试。

    charset总是得到latin1,下一句的转换我无论换成什么都不对

    utf-8 utf8,gbk,ascii等等。

    我现在是把 encode这句被屏蔽了,因为我的源文件,数据库什么的全都是utf-8的。

    暂时是解决这个问题,但怀疑到时在正式的linux环境下,可能还是有问题。

    最重要的还是要弄清 python的encode,decode的原理

  2. 豆瓣这里是这样解决这个问题的:

    conn=MySQLdb.connect(host=host, user=user, passwd=password, db=db, init_command="set names utf8")

    然后用conn就是了,再也不用考虑encoding的事情。

    还有一个好处是,如果中间timeout, MySQLdb自动重连时,可以保证新的链接仍然是utf-8。

  3. 当django的db是mysql时的处理办法:

    CREATE DATABASE db_name

    CHARACTER SET ‘utf8′;

    或者

    ALTER DATABASE db_name

    CHARACTER SET ‘utf8′;

  4. ?????? django ????????????????????????????????? « IT Notes

分享到:
评论

相关推荐

    python连接MySQL数据库问题.docx

    本文详细介绍了如何使用 Python 的 `MySQLdb` 库连接 MySQL 数据库,并解释了 `cursor()`、`execute()` 和 `fetchall()` 方法的作用。这些基本操作是进行数据处理和数据库操作的基础,对于任何涉及到 Python 和 ...

    pymysql python连接mysql数据库

    **PyMySQL:Python连接MySQL数据库** 在Python编程中,与MySQL数据库进行交互是常见的需求,而PyMySQL就是这样一个用于Python连接MySQL的库。PyMySQL是一个纯Python实现的MySQL客户端,它提供了与MySQL通信的接口,...

    Python连接mssql数据库编码问题解决方法

    值得强调的是,不仅仅是mssqlserver数据库,其他数据库如mysql(需要下载MySQLdb包)、sqllite(Python自带的文件数据库)、mongodb(需要下载PyMongo包)等也存在类似的编码问题,解决这些数据库的编码问题,也可...

    python MySQLdb使用教程详解

    在Python中,MySQLdb库是用于连接和操作MySQL数据库的一个流行模块。这篇教程将深入讲解如何使用MySQLdb进行数据的批量插入和更新操作。首先,我们来看一下Python MySQLdb的基本用法。 1. **安装MySQLdb**: 在...

    Python的MySQL数据库操作.docx

    - 在Python中与MySQL数据库建立连接是通过`MySQLdb`模块实现的。此模块提供了与MySQL服务器通信的能力。 - 代码示例:`conn = MySQLdb.connect(host='localhost', user='root', passwd='admin')` - `host`:MySQL...

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

    针对Python MySQLdb模块使用utf-8编码插入中文数据时遇到的问题,本文将详细介绍如何在Python中设置MySQL数据库和表的UTF-8编码,如何在Python代码中指定连接的字符集,并且讲解在插入数据后确保数据能够正确保存到...

    课题-Python-MySQLdb-学习总结.docx

    通过 MySQLdb,开发者能够使用 Python 语言来执行 SQL 语句,管理数据库连接,处理查询结果等。 #### 二、MySQLdb的核心对象 MySQLdb 提供了三个核心对象:`Connection`、`Cursor` 和 `Result`,它们构成了使用 ...

    python下MySQLdb使用.docx

    - `charset`: 数据库编码。 3. **事务处理**: - `commit()`:提交当前事务。 - `rollback()`:回滚当前事务。 4. **执行 SQL 语句**: - `callproc(self, procname, args)`:执行存储过程。 - `execute(self...

    2021_w_.1.python 驱动MySQLdb(create_engine)代码.pdf

    `MySQLdb`是一个用于Python的MySQL驱动程序,而`create_engine`是`SQLAlchemy`中的一个函数,用于创建数据库引擎,从而建立与MySQL数据库的连接。 首先,确保已经安装了所需的库,包括`pandas`、`numpy`、`MySQLdb`...

    python MysqlDb模块安装及其使用详解

    Python中的MysqlDb模块是用于连接和操作MySQL数据库的一个Python接口,它使得在Python程序中执行SQL语句、管理数据库表等任务变得简单。本文将详细介绍如何安装MysqlDb模块以及如何在Python中使用它来连接和操作...

    Python中MYSQLdb出现乱码的解决方法

    在Python编程中,当涉及到与MySQL数据库的交互时,经常会出现字符编码问题,尤其是在使用MYSQLdb这个Python的MySQL驱动库时。这个问题主要是由于...希望以上内容对Python程序设计者在处理数据库编码问题时有所帮助。

    Python使用MYSQLDB实现从数据库中导出XML文件的方法

    在这种场景下,我们可以利用Python的MYSQLDB库来连接MySQL数据库,并结合XML处理库(如xml.dom.minidom)来生成XML文件。下面将详细阐述这一过程。 首先,要使用MYSQLDB库,你需要确保已经安装了MySQL的Python驱动...

    Python MySQL进行数据库表变更和查询

    首先,我们需要导入Python中的`MySQLdb`模块,这是一个用于Python连接MySQL数据库的库。在示例代码中,我们看到如下导入语句: ```python import MySQLdb ``` 接着,我们定义了几个函数来执行不同的数据库操作,如...

    Python技术数据库驱动选用指南.docx

    不同的数据库驱动适用于不同的应用场景和需求,例如MySQLdb适用于Python 2.x版本下的MySQL数据库交互,而PyMySQL则更适合Python 3.x版本;psycopg2适用于需要高性能和高并发访问的PostgreSQL数据库交互;sqlite3适合...

    Python技术数据库操作技巧.docx

    在数据库操作中,Python 提供了多种数据库接口,如 MySQLdb(用于 MySQL)、psycopg2(用于 PostgreSQL)等,使得开发者能够轻松地与不同类型的数据库进行交互。 1. **连接数据库**: 使用 Python 的数据库驱动,...

    python爬虫的数据库连接问题【推荐】

    pymysql是Python中用于连接MySQL数据库的第三方库,它提供了类似MySQLdb的功能,但比MySQLdb更现代化,且兼容Python 3。在Python项目中,如果你需要与MySQL数据库交互,pymysql是一个很好的选择。 2. **数据库连接...

    pythonSQL驱动包

    在这个场景中,提到的是`MySQL-python-1.2.3`,这是一个经典的Python MySQL驱动,也被称为`MySQLdb`,它允许Python程序连接到MySQL数据库并执行SQL查询。 1. **Python与SQL的交互**: Python提供了多种方式来与SQL...

    使用python将mysql数据库的数据转换为json数据的方法

    我们还需要注意一些实际操作的细节,如正确安装和导入第三方库、确保数据库服务器的正常运行、数据库连接参数的正确性、SQL语句的语法无误,以及在使用Python的json模块进行数据转换时,编码方式的一致性。...

Global site tag (gtag.js) - Google Analytics