在Linux上使用pyodbc在nvarchar mssql字段中插入unicode或utf-8字符

在Linux上使用pyodbc在nvarchar mssql字段中插入unicode或utf-8字符,第1张

在Linux上使用pyodbc在nvarchar mssql字段中插入unicode或utf-8字符

我记得使用odbc驱动程序时会遇到这种愚蠢的问题,即使那是Java + oracle的组合。

核心是,odbc驱动程序在将查询字符串发送到数据库时显然会对其进行编码。即使该字段是Unipre,并且即使您提供Unipre,在某些情况下也似乎无关紧要。

您需要确保驱动程序发送的内容与数据库(不仅是服务器,而且还有数据库)具有相同的编码。否则,您当然会得到一些时髦的字符,因为在编码/解码时,客户端或服务器都会混淆。您是否知道服务器将其用作解码数据的默认字符集(如MS所说的代码点)?

整理与这个问题无关:)

例如,请参见该MS页面。对于Unipre字段,排序规则仅用于定义列中的排序顺序, 而不
用于指定数据的存储方式。

如果您将数据存储为Unipre,则有一种独特的方式来表示它,这就是Unipre的目的:无需定义与要使用的所有语言兼容的字符集:)

这里的问题是“当我将数据提供给 Unipre服务器时会发生什么?”。例如:

  • 当我向服务器发送UTF-8字符串时,它如何理解?
  • 当我向服务器发送UTF-16字符串时,它如何理解?
  • 当我向服务器发送Latin1字符串时,它如何理解?

从服务器的角度来看,所有这三个字符串只是字节流。服务器无法猜测您对其进行编码的编码。这意味着,如果您的odbc客户端最终向服务器发送 字节字符串
(编码字符串)而不是发送 unipre 数据, 则会
遇到麻烦:如果这样做,服务器将使用预定义的编码(这是我的问题:服务器将使用?(因为不能猜测,它必须是一个参数值),并且如果字符串是使用其他编码
dzing 编码的, 数据将被破坏。 __

它与Python中的 *** 作完全相似:

uni = u'Hey my name is André'in_utf8 = uni.enpre('utf-8')# send the utf-8 data to server# send(in_utf8)# on server side# server receives it. But server is Japanese.# So the server treats the data with the National charset, shift-jis:some_string = in_utf8 # some_string = receive()    depred = some_string.depre('sjis')

就试一试吧。很有趣。解码后的字符串应该是“嘿,我的名字是安德烈”,但是应该是“嘿,我的名字是安德烈”。é被日文replaced取代

因此,我的建议是:您需要确保pyodbc能够直接将数据作为Unipre发送。如果pyodbc无法做到这一点,您将得到意想不到的结果。

我以客户端到服务器的方式描述了问题。但是,当从服务器向客户端进行通信时,可能会出现相同类型的问题。如果客户端无法理解Unipre数据,您可能会遇到麻烦。

FreeTDS为您处理Unipre。

实际上,FreeTDS会为您处理事务,并将所有数据转换为UCS2
unipre。(来源)。

  • 服务器<-> FreeTDS:UCS2数据
  • FreeTDS <-> pyodbc:编码的字符串,以UTF-8编码(来自
    /etc/freetds/freetds.conf

因此,如果您将UTF-8数据传递给pyodbc,我希望您的应用程序能够正常工作。实际上,正如此django-
pyodbc票证所指出的那样,django-pyodbc在UTF-8中与pyodbc进行通信,所以应该没事。

FreeTDS 0.82

但是,cramm0表示FreeTDS
0.82并非完全没有错误,并且0.82和可以在此处找到的官方补丁0.82版本之间存在显着差异。您可能应该尝试使用修补的FreeTDS


编辑删除了与FreeTDS无关的旧数据,但仅与Easysoft商业odbc驱动程序有关。 抱歉。



欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5647119.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-16
下一篇 2022-12-16

发表评论

登录后才能评论

评论列表(0条)

保存