【问题标题】:SQLAlchemy and UnicodeDecodeErrorSQLAlchemy 和 UnicodeDecodeError
【发布时间】:2012-08-11 22:17:39
【问题描述】:

我来了

UnicodeDecodeError: 'ascii' codec can't decode byte 0xc2 in position 0: ordinal not in range(128)

当我将来自我正在使用 SQLAlchemy 访问的 MySQL 数据库的文本传递给此函数时:

re.compile(ur"<([^>]+)>", flags=re.UNICODE).sub(u" ", s)

数据库编码是 utf-8,我什至将编码传递给 SQLAlchemy 的 create_engine 函数。

编辑: 这就是我查询数据库的方式:

doc = session.query(Document).get(doc_id)
s = doc.title

根据建议,我将 s.decode('utf-8') 传递给 sub 。上面的错误消失了,但是对于不同的文档我得到了不同的错误:

UnicodeDecodeError: 'utf8' codec can't decode byte 0xeb in position 449: invalid continuation byte

数据库表定义如下:

CREATE TABLE `articles` (
  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
  `title` varchar(255) DEFAULT NULL,
  `cdate` datetime DEFAULT NULL,
  `link` varchar(255) DEFAULT NULL,
  `content` text,
  UNIQUE KEY `id` (`id`),
  UNIQUE KEY `link_idx` (`link`)
) ENGINE=InnoDB AUTO_INCREMENT=4127834 DEFAULT CHARSET=utf8;

任何帮助将不胜感激

【问题讨论】:

  • 我们可以再看一些代码吗? s 来自哪里? s.decode('utf8') 会解决问题吗?
  • @MartijnPieters 添加 s.decode('utf-8') 修复了该特定文档的错误,但如果我尝试从数据库中获取不同的文档,我会得到:UnicodeDecodeError: 'utf8' codec无法解码位置 449 中的字节 0xeb:无效的继续字节。所以,同样的错误,不同的性格。
  • 不,这是一个不同的错误(一个从 ascii 解码,另一个从 utf-8 解码)。这意味着第二个文档根本就不是 UTF-8 数据。这就是为什么我们想看看s 来自哪里。
  • 下一个问题:title 字段是如何在您的架构中定义的?
  • 问题可能不是sql炼金术。在表级别检查Mysql的编码是否真的是UTF-8。 (如果你有像 mysql-admin 这样的 GUI 工具会很有帮助)

标签: python mysql unicode encoding sqlalchemy


【解决方案1】:

我已经解决了这个问题。 SQLAlchemy 将title 列作为str 而不是Unicode 返回。 我认为将 encoding='utf8' 作为参数添加到 create_engine 会解决这个问题,但是,正确的做法是在数据库 URI 中传递它:mysql://me@myserver/mydatabase?charset=utf8

感谢您的所有回答!

【讨论】:

  • 我刚收到invalid connection option "charset" =/
  • 这太有帮助了!我希望这可以在 SQLAlchemy 本身中得到解决。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-13
  • 1970-01-01
  • 2015-03-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多