您的位置:首页 > 编程语言 > Python开发

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(), 否则会报错:找不到该方法)   
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息