pyodbc如何确定编码?

2024-05-28 20:26:34 发布

您现在位置:Python中文网/ 问答频道 /正文

到现在为止,我和Python(和Twisted)一起与Sybase SQL Anywhere 12战斗了好几个星期,我甚至把我的东西都用上了。

只剩下一个烦恼:如果我在CentOS 5上使用定制的Python2.7.1(即部署平台)运行我的脚本,我得到的结果是UTF-8

如果我在我的Ubuntu盒子(Natty Narwhal)上运行它,我会让它们进入latin1

不用说,我更喜欢用Unicode获取所有数据,但这不是问题的关键。:)

两者都是64位的盒子,都有一个定制的Python2.7.1。使用UCS4和定制的unixODBC 2.3.0。

我在这里不知所措。我找不到关于那件事的任何文件。什么使pyodbc或unixODBC在这两个框上的行为不同?

确凿事实:

  • Python:2.7.1
  • 数据库:SQL Anywhere 12
  • unixODBC:2.3.0(2.2.14的行为相同),使用相同的标志进行自编译
  • ODBC驱动程序:源于Sybase。
  • CentOS 5给我UTF-8,Ubuntu Natty Narwhal给我拉丁文1。

我的odbc.ini如下所示:

[sybase]
Uid             = user
Pwd             = password
Driver          = /opt/sqlanywhere/lib64/libdbodbc12_r.so
Threading       = True
ServerName      = dbname
CommLinks       = tcpip(host=the-host;DoBroadcast=None)

我只是用DNS'sybase'连接。

蒂亚!


Tags: hostsqlubuntu部署twisted平台utf盒子
2条回答

pyodbc使用ODBC规范,它只支持2种编码。所有以“W”结尾的ODBC函数都是使用SQLWCHAR的宽字符版本。这是由ODBC头定义的,通常是UCS2,但偶尔是UCS4。非宽版本使用SQLCHAR,并且总是(?)单字节ANSI/ASCII。

在ODBC中绝对不支持UTF8等可变宽度编码。如果ODBC驱动程序提供了这个功能,那就绝对不正确。即使数据存储在UTF8中,驱动程序也必须将其转换为ANSI或UCS2。不幸的是,大多数ODBC驱动程序都是完全错误的。

发送到驱动程序时,如果数据是“str”对象,pyodbc将使用ANSI;如果数据是“unicode”对象,pyodbc将使用UCS2/UCS4(无论平台上定义了什么SQLWCHAR)。驱动程序在返回数据时确定数据是SQLCHAR还是SQLWCHAR,而pyodbc对此没有任何发言权。如果是SQLCHAR,则转换为“str”对象;如果是SQLWCHAR,则转换为“unicode”对象。

对于默认情况下将SQLCHAR&;SQLWCHAR转换为Unicode的3.x版本,这将略有不同。

我不能告诉你为什么不同,但是如果你在DSN中添加“Charset=utf-8”,你应该在两台机器上都得到你想要的结果。

免责声明:我在SQL Anywhere工程的Sybase工作。

相关问题 更多 >

    热门问题