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 ..”查询,还是仅在创建数据库时运行?
谢谢。
答案 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无关。它们都是仅影响新表创建的所有命令,但我不知道您是否在后续连接中创建和删除表,或者仅在最初创建数据库时。