2016-07-18 11 views
1

MS AccessとPython 3.2.5と組み合わせてpyodbcを使用しています。pyodbcでUnicode utf-16/8を混乱させる

ODBCバージョンは今、大きな問題は、私が試してみて、私のテーブルを照会する場合、それはちんぷんかんぷんで値を返すことであるRHEL6システム

にunixODBCの2.2.14は、mdbドライバmsodbcsql-11.0.2270です。

例、SELECT * FROM tableリターン:

('ä¹ã', 'ã¶ã°ã°ã°ãµã°') 

今、このそれ自体では大きな問題ではありません、私はPythonの文字列に独自のエンコード方式を使用して、それをコードすることができます。

def _enc16(self, value): 
     return value.encode('utf-16')[2::] 

私は(私はこれはPythonの標準だと思った?)私のodbc.iniから

抜粋を私はUTF-16を使用するODBCドライバを言っているものの:

[mdb] 
Description = Microsoft Access 
Driver = MDBToolsODBC 
Database = /path/to/file.mdb 
Servername = localhost 
Charset = UTF16 
PORT = 5432 

これが問題の始まりです。 WHERE句を使ってテーブルをクエリしようとすると、Pythonの文字列とテーブルの内容を比較できない可能性があります。

したがってSELECT * FROM table WHERE id = '1'は対応するレコードがあるにもかかわらず(文をAccessにコピーしてレコードが見つかりました)、Noneを返します。

ここで最善のアプローチは何ですか? 正しいエンコーディングを返すようにODBCを設定します(これは既にしばらくの間これを使っています)、または検索条件をエンコードします( '1'を 'ä¹ã'に変換しますが、どうやって)?

ありがとうございました!

答えて

1

私はSELECT * FROM tableステートメントを使用して解決し、結果をリストのリストに入れました。 私はこのリストを単純検索して、私が探している一意のレコードを除外しました。私はこれがちょっと退屈だと知っていますが、うまくいきます。

rows = [[b'' if value is None else self._enc16(value) for value in row] for row in cursor.fetchall()] 

for row in rows: 
    for i, entry in enumerate(row): 
    row[i] = str(self._dec8(entry)) 
    if row[0] == str(samplenr): 
    break 

あなたが見ることができるように、私はPythonが読める文字列に変換することができUTF-16でスクランブル結果をコードし、UTF-8に再エンコードによる符号化の問題を解決しました。