python 3 和 LInux 上的 sqlite 出现 Unicode 错误

Unicode error with python 3 and sqlite on LInux

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

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

我从一堆 csv 文件(都是 utf8)初始化这个数据库,文件名是 table 名称,第一行是 headers。初始化是这样完成的:

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-job 被触发时(CI 工作 运行 在基于 centos7 的 docker 容器中),测试失败。经过一些调试后,我设法通过以下代码片段找到了失败的根本原因:

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

导致以下错误:

UnicodeEncodeError: 'ascii' codec can't encode character '\xe4' in position 317: ordinal not in range(128)

知道是什么原因造成的。 sqlalchemy 和 sqlite 都应该默认使用 utf8。为什么我的代码在 windows 中有效,但在 linux 中无效。我已经尝试解决这个问题一天了,但我很困惑。感谢任何帮助。

Python 是 3.6.8 版,我的 windows 和 linux 机器上的所有软件包都是相同的版本。

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

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