我已经围绕
pymssql
编写了一个包装器来连接到我工作的数据库。我遇到了 unicode 解码/编码错误,我正在尝试从源头上阻止它们。
当我指定
charset='latin1' or
'iso-8859-1'` 时,连接失败并出现以下错误:
File "pymssql.pyx", line 549, in pymssql.connect (pymssql.c:7672)
raise OperationalError(e[0])
pymssql.OperationalError: (20017, 'DB-Lib error message 20017, severity 9:\nUnexpected EOF from the server\nDB-Lib error message 20002, severity 9:\nAdaptive Server connection failed\n')
数据库编码看起来是“latin1”:
SELECT SERVERPROPERTY('Collation')
退货
SQL_Latin1_General_CP1_CI_AS
,我认为,与 Python 的
'latin1'
相同。
我这样做正确吗?我是否选择了错误的编码(即
latin1
或 iso-8859-1
?
看来它对你输入的内容相当挑剔。
考虑进入
charset="ISO-8859-1"
使用大写字母,例如“ISO-8859-1”或“LATIN1”。
pymssql
使用 GNU iconv 约定。
https://www.gnu.org/software/libiconv/
由于历史原因,国际文本通常使用与语言或国家/地区相关的字符编码进行编码。随着互联网的出现和跨国文本的频繁交换——甚至从国外查看网页在这种情况下也是一种“文本交换”——这些编码之间的转换变得非常重要。它们也成为一个问题,因为一种编码中存在的许多字符在许多其他编码中不存在。为了解决这个问题,Unicode 编码被创建了。它是所有其他编码的超级编码,因此是 XML 等新文本格式的默认编码。
尽管如此,许多计算机仍然在使用传统(有限)字符编码的区域设置中运行。某些程序(例如邮件程序和 Web 浏览器)必须能够在给定的文本编码和用户的编码之间进行转换。其他程序在内部以 Unicode 存储字符串,以方便内部处理,并且在进行 I/O 时需要在内部字符串表示形式(Unicode)和外部字符串表示形式(传统编码)之间进行转换。 GNU libiconv 是适用于这两种应用程序的转换库。
我的系统也使用“SQL_Latin1_General_CP1_CI_AS”排序规则设置,我发现即使与“LATIN1”连接,CHAR/VARCHAR 列中的字符仍然以马来编码返回。
根据 Microsoft 关于 SQL Server 的文档Code Page Architecture,要使用的代码页是 Windows-1252。
在
charset='WINDOWS-1252'
中使用 pymssql.connect
为我提供了正确的结果。
如果在使用 RHEL 的 Docker 映像上出现此错误怎么办:
iconv.c:134:未找到 ISO-8859-1 的 iconv 名称