python - 在 mySQL 上设置 UTF8

标签 python mysql utf-8

全部,

我正在尝试从 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/

相关文章:

python - pandas 列的数据类型在通过应用传递给函数时更改为对象?

python - 为什么 scikit PolynomialFeatures 的次数输出总是为 1?

ios - 如何在 Swift 中从包含土耳其字符 (çıüöğ) 的字符串创建 URL

java - Jar 输出中的 UTF-8 编码损坏

python - XlsxWriter write_formula 带日期

Python:填充空心物体

sql - 如何交换表中 2 条记录的列值?

mysql - 更新时,如果我的参数之一为空,如何从数据库中删除它?

mysql - 是否可以进行这样的查询?

delphi - 有没有办法从字符串中只获取 ANSI 字符?当字符串包含表情符号时 Utf8 解码失败