pymssql:在数据库连接中设置字符集选项会导致连接失败

Posted

技术标签:

【中文标题】pymssql:在数据库连接中设置字符集选项会导致连接失败【英文标题】:pymssql: Setting charset option in DB connection causes connection to fail 【发布时间】:2013-07-30 17:20:23 【问题描述】:

我已经围绕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')

DB 编码看起来是“latin1”:

SELECT SERVERPROPERTY('Collation')

返回

SQL_Latin1_General_CP1_CI_AS

我认为它与 Python 的 'latin1' 相同。

我这样做正确吗?我是否选择了错误的编码(即latin1iso-8859-1

【问题讨论】:

【参考方案1】:

看来你输入的内容很挑剔。

考虑输入charset="ISO-8859-1"

【讨论】:

【参考方案2】:

使用大写字母,例如“ISO-8859-1”或“LATIN1”。

pymssql 使用 GNU iconv 约定。 https://www.gnu.org/software/libiconv/

由于历史原因,国际文本通常使用与语言或国家/地区相关的字符编码进行编码。随着互联网的出现和国家间文本的频繁交换——在这种情况下,即使从外国查看网页也是一种“文本交换”——这些编码之间的转换变得很重要。它们也成为一个问题,因为在一种编码中存在的许多字符在许多其他编码中都不存在。为了解决这个问题,创建了 Unicode 编码。它是所有其他编码的超级编码,因此是 XML 等新文本格式的默认编码。

尽管如此,许多计算机仍然在使用传统(有限)字符编码的语言环境中运行。某些程序,如邮件程序和 Web 浏览器,必须能够在给定的文本编码和用户的编码之间进行转换。其他程序在内部以 Unicode 存储字符串,以方便内部处理,并且在进行 I/O 时需要在内部字符串表示(Unicode)和外部字符串表示(传统编码)之间进行转换。 GNU libiconv 是适用于这两种应用程序的转换库。

【讨论】:

【参考方案3】:

我的系统也使用“SQL_Latin1_General_CP1_CI_AS”排序规则设置,我发现即使使用“LATIN1”连接,CHAR/VARCHAR 列中的字符仍会返回马来编码。

根据 SQL Server Code Page Architecture 上的 Microsoft 文档,要使用的代码页是 Windows-1252。

pymssql.connect 中使用charset='WINDOWS-1252' 为我提供了正确的结果。

【讨论】:

以上是关于pymssql:在数据库连接中设置字符集选项会导致连接失败的主要内容,如果未能解决你的问题,请参考以下文章

如何在不使用 %s 的情况下安全、动态地在查询中设置列名?

即使选项在防火墙设置中设置为 yes,Azure SQL Server 防火墙也不允许操作连接

如何在控制台应用程序中设置默认连接字符串?

如何在连接字符串中设置实体框架 4 CommandTimeout?

如何在 select2 类型提前搜索中设置选项值以及如何从 ajax 数据添加选项组

memset()没有在c中设置内存