python - 编码从 pyodbc 到 MS SQL Server 的调用

标签 python sql-server encoding sqlalchemy

我正在通过 SQL Alchemy 使用 pyodbc 模块连接到 MS SQL 服务器。一切似乎都运行良好,直到我开始遇到编码问题。一些非 ascii 字符被替换为“?”

数据库有一个排序规则“Latin1_General_CI_AS”(我还检查了特定字段,它们保持相同的排序规则)。我开始在 create_engine 的调用中选择编码“latin1”,这似乎适用于西欧字符(如法语或西类牙语,字符如 é)但不适用于复活节欧洲字符。具体来说,我对字符 ć

有疑问

我一直在尝试选择其他编码as stated on Python documentation ,特别是 Microsoft 的,例如 cp1250cp1252,但我一直面临同样的问题。

有谁知道如何解决这些差异?排序规则“Latin1_General_CI_AS”是否与 Python 编码等效?

我当前连接的代码如下

for sqlalchemy import *

def connect():
    return pyodbc.connect('DSN=database;UID=uid;PWD=password')

engine = create_engine('mssql://', creator=connect, encoding='latin1')
connection = engine.connect()

澄清和评论:

  • 从数据库中检索信息时会出现此问题。我不需要存储任何东西。
  • 一开始我没有指定编码,结果是,每当在数据库中遇到非 ascii 字符时,pyodbc 都会引发 UnicodeDecodeError。我更正了使用“latin1”作为编码的问题,但这并没有解决所有字符的问题。
  • 我承认服务器不在 latin1 上,评论不正确。我一直在检查数据库排序规则和特定字段排序规则,似乎都在'Latin1_General_CI_AS'中,那么,如何存储ć?也许我没有正确理解排序规则。
  • 我更正了一点问题,具体来说,我尝试了比 latin1 更多的编码,还有 cp1250cp1252(这显然是一个用于“Latin1_General_CI_AS”,根据 msdn)

更新:

好的,按照这些步骤,我得到数据库使用的编码似乎是 cp1252:http://bytes.com/topic/sql-server/answers/142972-characters-encoding 无论如何,这似乎是一个糟糕的假设,正如答案所反射(reflect)的那样。

更新 2: 无论如何,在正确配置 odbc 驱动程序后,我不需要在 Python 代码上指定编码。

最佳答案

您应该停止使用代码页并改用 Unicode。这是摆脱此类问题的唯一方法。

关于python - 编码从 pyodbc 到 MS SQL Server 的调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3750876/

相关文章:

python - 在破折号中将值从一页传递到另一页

Python从给定字符串中过滤数据

sql-server - 关于列绑定(bind)的 SSAS 多维数据集处理错误

sql-server - SQL 函数返回错误值

java - 对 cookie 中设置的电子邮件地址进行转义/解码

java - 如何更改 Emma 的 HTML 报告的编码?

python - 在 Python 中,编写一个脚本来确定用户输入的数字是否为质数

python - Python中反引号的含义

javascript - SQL 查询上的 PHP AJAX 日期时间范围问题

http - 路径/url 中的百分比编码保留字符?