使用Python 3.6中的pandas.to_sql将异国情调(非ascii)字符写入Oracle DB

时间:2017-07-24 14:28:03

标签: python oracle pandas encoding

我很难将包含非ASCII字符的pandas.DataFrame的值写入Oracle数据库。这是一个可重现的示例(给定一个真实的连接字符串):

import pandas as pd
from sqlalchemy import create_engine, Unicode, NVARCHAR

connection_string = oracle://<name>:<password>@<database>'

df = pd.DataFrame([
        ['Société Générale']
    ], columns=['firm'])

conn = create_engine(connection_string, encoding='utf-8')
dtypes = {'firm': Unicode(40)}

df.to_sql('test', con=connection_string, dtype=dtypes, if_exists='replace')

产生的错误类似于

UnicodeEncodeError: 'ascii' codec can't encode character '\xe9' in position 4: ordinal not in range(128)

我想问题是如何在编写时使用UTF-8编码。我知道encodingcreate_engine的默认值为utf-8',我认为它会控制所使用的编码。 我也试过了dtypes = {'firm': NVARCHAR(40, convert_unicode=True)}但是得到了同样的错误。

我尝试在写入之前对数据进行编码(df['firm'] = df.firms.str.encode('utf-8')),这确实解决了这个问题,只会导致更大的问题。

这似乎是一个直截了当的问题,但我花了几个小时看文档和SO,无法弄清楚要做什么。

使用的版本是; Python: 3.6pandas: 0.20sqlalchemy: 1.11

1 个答案:

答案 0 :(得分:1)

这是一个古老的问题,但我最近遇到了同样的问题,并找到了适合我的解决方案。

我必须设置

os.environ['NLS_LANG'] = ".AL32UTF8"

它对我有用。但是我发现插入数据非常慢。