【问题标题】:How to insert cp1252 characters using MySQLdb?如何使用 MySQLdb 插入 cp1252 字符?
【发布时间】:2019-05-18 14:39:20
【问题描述】:

当我尝试使用 python MySQLdb 插入右双引号 (”) 时,它会生成 UnicodeEncodeError: 'latin-1' codec can't encode character u'\u201d' in position 0: ordinal not in range(256)。 python MySQLdb 默认使用 latin-1 编解码器,从/usr/share/mysql/charsets/ 中的 index.xml 文件中,它被描述为 cp1252 West European。因此,我认为 latin1 也将涵盖 cp1252 字符。但是 latin1 不会覆盖 cp1252 字符,如果它们覆盖,我将不会得到错误。

右双引号位于 cp1252 字符集中,但不在 ISO 8859-1(或 latin1)字符集中。

/usr/share/mysql/charsets/ 中没有 cp1252.xml 文件。为什么 python MySQLdb 缺少 cp1252 字符集?

或者latin1 是否与cp1252 相同,如index.xml 中所述。

【问题讨论】:

  • "python MySQLdb 使用 latin-1 编解码器" 这个假设是错误的。当您connect() 到数据库时,它将使用您配置的任何编码。你只是没有配置任何东西。
  • @Tomalak 默认情况下,它采用 latin1 代码。我的错误是UnicodeEncodeError: 'latin-1' codec can't encode character
  • @Tomalak 这不是重复的。我已经说过我不想使用 'utf8' 作为字符集。是否可以将字符集设置为 cp1252?
  • 再次阅读我的第一条评论。

标签: python-2.7 character-encoding mysql-python cp1252


【解决方案1】:

您真的需要 cp1252,而不是 utf-8? 我强烈建议使用 utf-8。

你需要的是:

  • charset="utf8mb4" 选项传递给MySQLdb.connect()
  • 将数据库配置为使用 utf-8。

您可以通过CREATE DATABASE <your db name> DEFAULT CHARACTER SET utf8mb4 使用utf-8 创建数据库。

如果您已经有数据库,您可以通过ALTER DATABASE <your db name> CHARACTER SET utf8mb4 更改默认字符集。但是您也需要更改数据库中现有表的所有字符集。

【讨论】:

  • 是的,没关系。但是cp1252呢?在 MySQLdb 中可用吗?
  • 没有。 MySQL 和 MySQLdb 不支持它。 latin1 受支持,但未经过良好测试。
  • 除 ascii 和 utf-8 之外的所有编码都是旧的。除非有特殊原因,您应该使用 utf-8。我(PyMySQL、mysqlclient-python(又名 MySQLdb)和 go-sql-driver/mysql 的维护者)不测试除 utf-8 之外的编码。
  • MySQLdb 不支持,但 MySQL 支持 cp1252 编码。但是,它被命名为 latin1。你可以参考这里dev.mysql.com/doc/refman/8.0/en/charset-we-sets.html
  • 是的,我已经说过“支持latin1”了。 cp1252 是 Windows 特定的编码。它与 ISO-8859-1 非常相似,但并不完全相同。见i18nqa.com/debug/table-iso8859-1-vs-windows-1252.html这就是为什么我说不支持cp1252,但支持latin1。
猜你喜欢
  • 2014-06-13
  • 2018-05-11
  • 2020-07-15
  • 2012-12-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-30
  • 1970-01-01
相关资源
最近更新 更多