Python mysqldb 操作mysql出现中文乱码问题
2014-12-06 11:26
459 查看
一.mysql本身的问题:
1.数据库编码问题:
mysql数据库本身有默认编码,可以通过status; 或show variables like 'character_set_%'; 命令来查看。比如用后者查看时,会看到一系列形如“character_set_xxxxx”的全局变量,这就是数据库的默认编码。所有数据表、表中字段,在创建时,若没有专门指定编码格式,都会默认使用数据库编码。
修改数据库编码有两种方式,(1)set character_set_xxxxxx = 'xxxxx'(编码名称), 即直接修改全局变量的值。(2)修改mysql配置文件—— 在windows下,mysql配置文件为my.ini,在linux下,mysql配置文件为my.cnf。修改其中相应字段即可。
需要注意的是:mysql版本不同时,配置文件的修改方式也有所不同,这一点具体内容可以自行百度。
2.数据表默认编码问题:
数据表自身也有默认编码,若建表时未指定编码,则表的编码默认采用当前的数据库编码。而修改数据库编码时不会影响已存在的表的编码。所以要想修改某个已有的表的编码方式,则只能直接改表而不能改数据库。
查看数据表编码: show create table <table name>; 输出结果中的DEFAULT CHARSET即为该表编码。
修改数据表编码: alter table <table_name> character set <charset_name>;
3.数据表中字符型字段(char、varchar、text等)的编码问题:
在建表时,或者在已有表中修改、新增字符型字段(char, varchar, text等)时,这些字段的编码格式与表的默认编码相同。而且,修改表的默认编码格式不影响已存在的字段的编码格式。所以同样,在修改数据表编码后,如果没有修改已有字段的编码格式,还是会乱码。必须要对字段编码格式进行手动修改。
查看字段编码格式:show create table <表名>; 这一命令同时显示出表和表中各字段编码格式。
修改字段编码格式:
alter table <table_name> modify <column_name> … CHARACTER SET <charset_name>;
(参见修改数据表时modify与change的用法)
小结:
1.mysql的编码是各级独立的,在没有指定编码格式的条件下,下一级默认与上一级编码方式相同(第一级——数据库,第二级——数据表,第三级——表中字段);各级编码可以单独指定,允许不同;修改某一级编码不影响任何已存在的内容及其编码格式。
2.所以修改后一定要查看各级状态信息,确定已经完全一致才可以,否则很可能由于各级独立而导致状态信息不一致。
二.mysqldb的问题:
但是,即便修改了数据库的编码,在python中还是会存在中文存入数据库时候的乱码问题,解决方法就是在链接数据库的时候指定编码。例如:
sql_con = MySQLdb.connect(host=MYSQL_ADDR , user=MYSQL_USER , passwd=MYSQL_PWD , db=MYSQL_DB , charset="utf8")
这就指定了客户端的编码是utf8,然后就解决了乱码问题。
三.Python自身的编码问题:
Python内部处理编码默认是ascii,虽然python在很多情况下可以自行检测输入数据的编码格式并进行相应的处理,但有些时候还是会有问题。如果能够确定输入的中文数据是哪种编码(通常最多见的就是utf8),那么最好是将python内部默认编码改成这种编码。
查看python系统编码:
import sys
print sys.getdefaultencoding()
修改python系统编码:
import sys
reload(sys)
sys.setdefaultencoding('utf-8')
(一定要有reload(), 否则会报错:找不到该方法)
1.数据库编码问题:
mysql数据库本身有默认编码,可以通过status; 或show variables like 'character_set_%'; 命令来查看。比如用后者查看时,会看到一系列形如“character_set_xxxxx”的全局变量,这就是数据库的默认编码。所有数据表、表中字段,在创建时,若没有专门指定编码格式,都会默认使用数据库编码。
修改数据库编码有两种方式,(1)set character_set_xxxxxx = 'xxxxx'(编码名称), 即直接修改全局变量的值。(2)修改mysql配置文件—— 在windows下,mysql配置文件为my.ini,在linux下,mysql配置文件为my.cnf。修改其中相应字段即可。
需要注意的是:mysql版本不同时,配置文件的修改方式也有所不同,这一点具体内容可以自行百度。
2.数据表默认编码问题:
数据表自身也有默认编码,若建表时未指定编码,则表的编码默认采用当前的数据库编码。而修改数据库编码时不会影响已存在的表的编码。所以要想修改某个已有的表的编码方式,则只能直接改表而不能改数据库。
查看数据表编码: show create table <table name>; 输出结果中的DEFAULT CHARSET即为该表编码。
修改数据表编码: alter table <table_name> character set <charset_name>;
3.数据表中字符型字段(char、varchar、text等)的编码问题:
在建表时,或者在已有表中修改、新增字符型字段(char, varchar, text等)时,这些字段的编码格式与表的默认编码相同。而且,修改表的默认编码格式不影响已存在的字段的编码格式。所以同样,在修改数据表编码后,如果没有修改已有字段的编码格式,还是会乱码。必须要对字段编码格式进行手动修改。
查看字段编码格式:show create table <表名>; 这一命令同时显示出表和表中各字段编码格式。
修改字段编码格式:
alter table <table_name> modify <column_name> … CHARACTER SET <charset_name>;
(参见修改数据表时modify与change的用法)
小结:
1.mysql的编码是各级独立的,在没有指定编码格式的条件下,下一级默认与上一级编码方式相同(第一级——数据库,第二级——数据表,第三级——表中字段);各级编码可以单独指定,允许不同;修改某一级编码不影响任何已存在的内容及其编码格式。
2.所以修改后一定要查看各级状态信息,确定已经完全一致才可以,否则很可能由于各级独立而导致状态信息不一致。
二.mysqldb的问题:
但是,即便修改了数据库的编码,在python中还是会存在中文存入数据库时候的乱码问题,解决方法就是在链接数据库的时候指定编码。例如:
sql_con = MySQLdb.connect(host=MYSQL_ADDR , user=MYSQL_USER , passwd=MYSQL_PWD , db=MYSQL_DB , charset="utf8")
这就指定了客户端的编码是utf8,然后就解决了乱码问题。
三.Python自身的编码问题:
Python内部处理编码默认是ascii,虽然python在很多情况下可以自行检测输入数据的编码格式并进行相应的处理,但有些时候还是会有问题。如果能够确定输入的中文数据是哪种编码(通常最多见的就是utf8),那么最好是将python内部默认编码改成这种编码。
查看python系统编码:
import sys
print sys.getdefaultencoding()
修改python系统编码:
import sys
reload(sys)
sys.setdefaultencoding('utf-8')
(一定要有reload(), 否则会报错:找不到该方法)
相关文章推荐
- python操作mysql中文乱码问题
- Python操作Mysql中文乱码问题
- 【Python】Mysql中文乱码问题与MySQLdb对Mysql操作类的改进
- Python操作MySQL以及中文乱码的问题
- Python操作MySQL以及中文乱码的问题
- Python操作MySQL以及中文乱码的问题_mengl_2011-ChinaUnix博客
- python django MySQLdb 连接 mysql 5.5 中文乱码问题的解决
- Python操作MySQL以及中文乱码的问题_mengl_2011-ChinaUnix博客
- Python操作MySQL以及中文乱码的问题
- python的sqlaclchemy模块连接mysql数据出现中文乱码问题
- Python操作MySQL以及中文乱码的问题
- Python操作MySQL以及中文乱码的问题
- python+mysql 操作数据库出现的中文编码问题
- Python操作中出现中文乱码等问题
- Python操作MySQL以及中文乱码的问题
- Python操作MySQL以及中文乱码的问题
- C#操作MySQL时,出现的中文乱码的解决方案
- 若使用终端操作mysql时出现中文乱码
- Openstack数据库中文乱码问题---Django Python SQLAlchemg MySQL