使用 pandas to_sql 方法导出数据到 SQL Server 2016,发现一些特殊符号存在乱码,如下:
查看 pandas 生成的表结构,发现其采用 text 类型,该类型仅支持存储 非Unicode数据, 对于一些 Unicode数据(如表情包) 就不适用了!
ntext、text 和 image (Transact-SQL)
明白原因事情就好办了, 通过 to_sql 函数的 dtype 参数指定字段类型 (ntext / nvarchar
), 成功解决问题!
完整代码如下:
import pyodbc
import pandas as pd
from sqlalchemy.types import NVARCHAR
from sqlalchemy import create_engine
from sqlalchemy.engine import URL as sqlalchem_URL
TestEngine = create_engine(sqlalchem_URL.create(
drivername='mssql+pyodbc',
username='***',
password='***',
host='***',
database='***',
query={
"driver": "ODBC Driver 18 for SQL Server",
"TrustServerCertificate": "yes"
}
), fast_executemany=True)
data = [
'中文',
'中文符号: !¥……()',
'特殊符号: m³ m² 卍♣⑧Φ',
'表情包: 😂❤️😁😘'
]
df = pd.DataFrame(data, columns=['name'])
df.to_sql('test22', con=TestEngine, index=False, dtype={"name": NVARCHAR()})