全部,
我正在尝试从 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..”查询还是仅在创建数据库时运行?
谢谢。
最佳答案
这些不同的命令执行不同的操作。而且你甚至没有做所有正确的事情。
首先,如果您使用的是 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 文字。
同时,当您将 charset
参数传递给 connect
或调用set_character_set
。这就是为什么旧文档有时会说如果无法传递 charset='utf8'
,则传递 init_command='SET NAMES utf8'
。因此,您永远不需要这样做。
当然,其他三个 SET
查询首先与 Unicode 无关。它们都是仅影响新表创建的命令,但我不知道您是否在后续连接中创建和删除表,或者仅在最初创建数据库时创建和删除表。
关于python - 在 mySQL 上设置 UTF8,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21397035/