在mySQL上设置UTF8

时间:2014-01-28 04:47:50

标签: python mysql utf-8

ALL,

我正在尝试从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和“SET ..”查询,还是仅在创建数据库时运行?

谢谢。

1 个答案:

答案 0 :(得分: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参数应为{{ 1}}对象,而不是unicode个对象。你经常会做得不好(基本上,如果它们是纯ASCII),但你不应该依赖它。即使对于启动时的全局,编译指示等语句也是如此:对这些语句也使用str Unicode文字。

同时,前两个u'…'应该是您将SET参数传递给charset或调用connect时数据库库的功能的一部分。这就是为什么如果您无法通过set_character_set,旧文档有时会传递init_command='SET NAMES utf8'。所以,你永远不需要这样做。

其他三个charset='utf8'查询当然与Unicode无关。它们都是仅影响新表创建的所有命令,但我不知道您是否在后续连接中创建和删除表,或者仅在最初创建数据库时。