|
23
|
| nosklo · 技术社区 · 16 年前 |
|
|
1
22
我记得在使用odbc驱动程序时遇到过这种愚蠢的问题,即使当时它是java+oracle的组合。
排序与此问题无关:)看 that MS page 例如。对于Unicode字段,排序规则仅用于定义列中的排序顺序, 指定数据的存储方式。 如果您将数据存储为Unicode,则有一种独特的方式来表示它,这就是Unicode的目的:不需要定义与您要使用的所有语言兼容的字符集:) Unicode?“.例如:
如果您的odbc客户端最终发送了消息,则会遇到麻烦 (编码字符串)发送到服务器,而不是发送 统一码 data:如果你这样做,服务器将使用预定义的编码(我的问题是:服务器将使用什么编码?因为它不是猜测,所以它必须是一个参数值),如果字符串使用了不同的编码, ,数据将被损坏。 这与在Python中做的完全相似:
因此,我的建议是:您需要确保pyodbc能够直接以Unicode格式发送数据。如果pyodbc未能做到这一点,您将得到意想不到的结果。 我以客户端到服务器的方式描述了这个问题。但是,当从服务器向客户端进行通信时,也可能出现同样的问题。如果客户端无法理解Unicode数据,您可能会遇到麻烦。 实际上,FreeTDS会为您处理事情,并将所有数据转换为UCS2 unicode。 ( Source ).
因此,如果您将UTF-8数据传递给pyodbc,我希望您的应用程序能够正常工作。事实上,正如 django-pyodbc ticket cramm0 FreeTDS 0.82并非完全没有bug,0.82与官方修补的0.82版本之间存在显著差异 here 。您可能应该尝试使用已修补的FreeTDS : 删除了与FreeTDS无关但仅与Easysoft商业odbc驱动程序相关的旧数据。对不起的。 |
|
|
2
2
更正:我更改了.freetds.conf条目,以便客户端使用UTF-8
驱动程序在用于数据服务器端存储的UCS-2和提供给客户端/从客户端获取的UTF-8编码字符串之间进行透明转换。
import pyodbc
test_string = u"""Comment ça va ? Très bien ?"""
print type(test_string),repr(test_string)
utf8 = 'utf8:' + test_string.encode('UTF-8')
print type(utf8), repr(utf8)
c = pyodbc.connect('DSN=SA_SQL_SERVER_TEST;UID=XXX;PWD=XXX')
cur = c.cursor()
# This does not work as test_string is not UTF-encoded
try:
cur.execute('INSERT unicode_test(t) VALUES(?)', test_string)
c.commit()
except pyodbc.Error,e:
print e
# This one does:
try:
cur.execute('INSERT unicode_test(t) VALUES(?)', utf8)
c.commit()
except pyodbc.Error,e:
print e
这是测试表的输出(我通过Management Studio手动输入了一堆测试数据) In [41]: for i in cur.execute('SELECT t FROM unicode_test'):
....: print i
....:
....:
('this is not a banana', )
('\xc3\x85kergatan 24', )
('\xc3\x85kergatan 24', )
('\xe6\xb0\xb4 this is code-point 63CF', )
('Mich\xc3\xa9l', )
('Comment a va ? Trs bien ?', )
('utf8:Comment \xc3\xa7a va ? Tr\xc3\xa8s bien ?', )
|
|
|
3
1
|
|
|
4
0
pyodbc上有一个打开的bug Problem fetching NTEXT and NVARCHAR data . |
|
|
Boltu · pandas从url返回的值是什么? 1 年前 |
|
|
trystine · 试图运行CausalNex错误UnicodeEncodeError:“charmap”编解码器无法对位置263607-263621中的字符进行编码:字符映射到<undefined> 1 年前 |
|
|
Danny Coleiro · 向文本字符串添加不可见字符 1 年前 |