今天写个python脚本从MySQL导数据,导入和导出的两个数据库的编码不一致,需要建立两个数据连接,分别使用不同的字符集,按MySQLdb的文档说明,只需要在MySQLdb.Connect()设置charset参数即可
charsetIf present, the connection character set will be changed to this character set, if they are not equal. Support for changing the character set requires MySQL-4.1 and later server; if the server is too old, UnsupportedError will be raised. This option implies use_unicode=True, but you can override this with use_unicode=False, though you probably shouldn't.
If not present, the default character set is used.
This must be a keyword parameter.
但并没有如愿设置成功,无论我传给charset什么参数,调用character_set_name()总是返回"latin1",因为在其他服务器运行同样的脚步没问题,可以肯定是服务器的配置原因
开始以为是MySQLdb-python库的问题,于是重新下载并自己编译,但编译遇到一点问题,因为编译时需要运行mysql_config检测MySQL的配置,但运行mysql_config没有输出任何信息
仔细检查一下这台服务器的MySQL相关配置,很是古怪:
#rpm -qa|grep mysql
mysqlclient10-3.23.58-4.RHEL4.1
mysql-devel-4.1.22-2.el4_8.4
mysqlclient10-devel-3.23.58-4.RHEL4.1
#rpm -qa|grep MySQL
perl-DBD-MySQL-2.9004-3.1
MySQL-shared-standard-4.1.22-0.rhel3
MySQL-python-1.2.1_p2-1.el4.1
MySQL-server-standard-4.1.22-0.rhel3
MySQL-client-standard-4.1.22-0.rhel4
mysql开头的几个包是Red Hat Linux自带的包,MySQL开头的几个包是MySQL.com RPM包,混着装一起了,难怪mysql_config无法检测到任何信息,考虑到MySQL-server正在运行,于是快刀斩乱麻,把那几个Red Hat自带的包都清理了(rpm -e xxx),然后安装MySQL.com的RPM包,也顺便把rhel3的MySQL-shared和MySQL-server换成rhel4版本(服务器运行的是RHEL4系统),因为服务器正在运行,所以采用更新的方式(rpm -Uvh xxx.rpm)。
谨慎起见,MySQL-server版本保留不变,其他包统一按MySQL-server的版本装上4.1.22的包(顺便说一下,我习惯在http://rpm.pbone.net找软件包),现在看起来整齐多了:
#rpm -qa|grep MySQL
perl-DBD-MySQL-2.9004-3.1
MySQL-server-standard-4.1.22-0.rhel4
MySQL-shared-standard-4.1.22-0.rhel4
MySQL-client-standard-4.1.22-0.rhel4
MySQL-devel-standard-4.1.22-0.rhel4
这次可以正常编译MySQLdb-python了(需要先安装easy_install, MySQL-python-1.2.3的源代码包已经提供了ez_setup.py脚本,运行python ez_setup.py就可以安装了,然后运行python setup.py build编译MySQL-python, 再运行python setup.py install即可按egg方式把最新编译的MySQLdb-python安装到Python库中)
杯具的是,问题依旧,character_set_name()还是返回"latin1"。
再仔细阅读MySQLdb-python的文档,里面关于MySQL的要求提到:
* MySQL.com RPM packages:
- MySQL-devel to compile
- MySQL-shared if you want to use their shared
library. Otherwise you'll get a statically-linked module,
which may or may not be what you want.
- MySQL-shared to run if you compiled with MySQL-shared installed
这里并没有提到版本的要求,抱着死马当活马医的态度,把MySQL-devel和MySQL-client两个包更新到较新的版本(谨慎一点,数据库还是保留了原来的4.1.22版本,顺便提一下,rpm的更新方式确实比较强大,版本跳跃较大的情况下更新起来也很顺利),现在几个MySQL的包安装如下:
#rpm -qa|grep MySQL
perl-DBD-MySQL-2.9004-3.1
MySQL-server-standard-4.1.22-0.rhel4
MySQL-shared-standard-4.1.22-0.rhel4
MySQL-client-community-5.1.56-1.rhel4
MySQL-devel-community-5.1.56-1.rhel4
问题居然解决了,看来MySQLdb-python对MySQL包的版本还是有一定要求的。