2014-01-28 39 views
0

全部,在MySQL上设置UTF8

我试图从Python脚本实现mySQL通信。以下是我有:

try: 
    if append: 
     self.conn = MySQLdb.connect(.....) 
     self.cur = self.conn.cursor() 
    else: 
     self.conn = MySQLdb.connect(.....) 
     self.cur = self.conn.cursor() 
    self.conn.set_character_set('utf8;') 
    self.cur.execute('SET NAMES utf8;') 
    self.cur.execute('SET character_set_connection=utf8;') 
    self.cur.execute('SET GLOBAL innodb_large_prefix=ON') 
    self.cur.execute('SET GLOBAL innodb_file_format=barracuda') 
    self.cur.execute('SET GLOBAL innodb_file_per_table=ON') 
# Database and table creation 

现在我的问题是:我应该用这个UTF8和“设置..”查询,为每个连接或创建数据库,只有当?

谢谢。

+0

我不认为有一个名为''utf8;''的字符集。 – abarnert

+0

@abarnert,它的工作,所以我没有看语法。但我认为这个问题是我应该执行这些行,无论我是创建还是添加。我对吗? – Igor

回答

2

这些不同的命令做不同的事情。而且你甚至没有做所有正确的。首先,如果您使用的是pyMySQL或更高版本的MySQLdb,请将charset='utf8'(注意:'utf8'没有附加分号!)作为connect命令的参数。这意味着您的连接默认为UTF-8,并且启用了use_unicode模式,并且您不需要set_character_set。这是一个更好的解决方案。显然,每当你打开一个连接时,你都需要传递这个连接,因为它是连接的参数。

如果库不接受charset说法,那么你将不得不使用set_character_set,你应该在connect后立即这样做,每次连接时间。但是,不要在那里包含那个尾随的;

其次,如果是这样的Python 2.x中,一旦启用use_unicode所有 SQL字符串和所有字符串值的SQL参数应unicode对象,而不是str对象。如果没有正确地做到这一点(基本上,如果它们是纯ASCII的),你经常会逃脱,但是你不应该依赖它。甚至对于启动时的全局语言,杂注语句等语句也是如此:对于这些语句,也使用u'…' Unicode文字。

同时,那些前两个SET应该是当您在charset参数传递到connect或致电set_character_set数据库库做什么的一部分。这就是为什么如果你不能通过charset='utf8',旧的文档有时会说通过init_command='SET NAMES utf8'。所以,你永远不需要去做。

其他三个SET查询当然与Unicode没有任何关系。它们都是只影响创建新表的命令,但我不知道是否在后续连接中创建和删除表,或者仅在数据库最初创建时创建和删除表。

+0

谢谢你的解释。后续几项工作:1.我如何知道MySQLDB版本? 2.使用第一句话所需的最小版本是多少? 3.也许为了兼容性,总是使用“set_character_set”? 4.最后3个查询 - 即使没有创建新表格,它们也会执行,对吗? – Igor

+0

如果你知道还有一件事情:Windows上mySQL连接的默认编码是什么(客户端和服务器本地 - 开发版本)是什么? – Igor

+0

另一个 - 我应该在哪里启用“use_unicode”?我现在正在使用Windows XP进行开发。希望最后一个 - 前两个SET命令是额外的,因为它们将执行set_character_set将执行的操作,因此它们不是必需的,对吗? – Igor