Linux 3 和 Linux 上的 sqlite 的 Unicode 错误



我有一个Python程序,可以从SQL数据库中的数据生成报告。对于 CI 管道测试,我使用以下命令在内存中创建一个 sqlite3 数据库:

from sqlaclhemy import create_engine
eng = create_engine("sqlite:///")
con = eng.connect()

我从一堆 csv 文件(所有 utf8(初始化这个数据库,文件名作为表名,第一行作为标题。初始化是这样完成的:

import petl as etl
for file in folder:
filename = os.path.splittext(os.path.basename(os.path.absname(file))[0])
data = etl.fromcsv(file, delimiter='|', encoding="utf8")
etl.todb(csvTable, con, filename, create=true)

然后,此数据库用于运行应用的测试。

所有测试在我的 Windows-10 开发机器中都运行良好,但是当我推送到 git 并触发 CI 作业时(CI 作业在基于 centos7 的 docker 容器中运行(,测试失败。经过一些调试,我设法通过以下代码片段找到了失败的根本原因:

results = etl.fromdb(con, "SELECT * FROM PERSONS")
print(results)

这会导致以下错误:

UnicodeEncodeError: 'ascii' 编解码器无法在位置 317 中编码字符 '\xe4':序号不在范围内 (128(

知道是什么原因造成的。sqlalchemy 和 sqlite 都应该使用 utf8 作为默认值。为什么我的代码在Windows中工作,但在Linux中不起作用。我一直在尝试解决这个问题一天了,但我被难住了。任何帮助,不胜感激。

Python 是 3.6.8 版,在我的 Windows 和 Linux 机器中,所有包都是相同的版本。

PS打印命令用于演示问题(测试字体使用 print(((。实际问题是,当查询包含 Unicode 字符(在本例中为"ä"(的表时,结果为空。

好的,根据克劳斯的评论,问题出在语言环境上。我们的 docker 容器没有 localectl 进程,即使 locale 是在/etc/locale.conf 中设置的,系统默认为 POSIX。添加 LANG 环境变量解决了该问题。

最新更新