如何将 UTF8 字符从 pandas 导出到 MS SQL

Pyt*_*ous 1 sql-server sqlalchemy utf-8 pandas

我正在尝试将 pandas 中的表导出到 Microsoft SQL Server Express 数据库。

Pandas 读取编码为 utf8 的 CSV 文件。如果我执行 df.head(),我可以看到 pandas 正确显示外文字符(它们是希腊字母)

但是,导出到 SQL 后,这些字符显示为问号和零的组合。

我究竟做错了什么?

我找不到 to_sql() 有任何设置编码的选项。我想我必须在设置 SQL 引擎时更改语法,但具体如何更改呢?

这就是我一直在尝试的:

import numpy as np
import pandas as pd
from sqlalchemy import create_engine, MetaData, Table, select
import sqlalchemy as sqlalchemy


ServerName = my_server_name
Database = my_database
params = '?driver=SQL+Server+Native+Client+11.0'
engine = create_engine('mssql+pyodbc://' + ServerName + '/'+ Database + params, encoding ='utf_8', fast_executemany=True )
connection = engine.raw_connection()
cursor = connection.cursor()

file_name = my_file_name

df = pd.read_csv(file_name, encoding='utf_8', na_values=['null','N/A','n/a', ' ','-']  , dtype = field_map, thousands =',' )

print(df[['City','Municipality']].head())  # This works
Run Code Online (Sandbox Code Playgroud)

Pyt*_*ous 5

结合 Lamu 的评论和这些答案:

pandas to_sql 所有列均为 nvarchar

用python将unicode数据写入mssql?

我想出了下面的代码,它有效。基本上,运行 to_sql 时,我将所有对象列导出为 NVARCHAR。这在我的具体示例中很好,因为所有日期都是日期时间而不是对象,但在日期存储为对象的情况下可能会很混乱。

关于如何处理这些案件还有什么建议吗?

from sqlalchemy.types import NVARCHAR
txt_cols = df.select_dtypes(include = ['object']).columns
df.to_sql(output_table, engine, schema='dbo', if_exists='replace', index=False, dtype = {col_name: NVARCHAR for col_name in txt_cols}
Run Code Online (Sandbox Code Playgroud)

PS 注意我不认为这个答案与其他答案重复;有一些差异,例如 df.select.dtypes 的使用