You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python脚本无法将非英文字符正确写入SQL数据库求助

解决Pandas读取含非ASCII字符CSV并导入SQL Server时的乱码问题

问题现象

使用Pandas读取包含中文、西里尔字符的CSV文件,导入SQL Server后,所有非ASCII字符均显示为???。

源CSV数据

Last Name   First Name  Middle Name Full Legal Name
last擺田手1    first擺田手1   middle擺田手1  fulllegal1擺田手
Last擺田手2    first擺田手2   middle擺田手2  fulllegal擺田手
lastname6БдД    firstname6БдД   middlename6БдД  fulllegal6БдД
lastname7БдД    firstname7БдД   middlename7БдД  fulllegalname7БдД
lastname8БдД    firstname8БдД   middlename8БдД  fulllegalname8БдД

数据库中错误显示结果

LastName    FirstName   MiddleName  FullLegalName
last???1    first???1   middle???1  fulllegal1???
Last???2    first???2   middle???2  fulllegal2???
lastname???3    firstname???3   middlename???3  fulllegal3???
lastname???4    firstname???4   middlename???4  fulllegalname4???
lastname???5    firstname???5   middlename???5  fulllegalname5???

原实现代码

from sqlalchemy import create_engine
import pandas as pd
import datetime
 
def ImportDataToDB():
    servername = 'CWQ00xxxxx.xxxxxx.com'
    dbname = 'AbbottRPA'
    Input_file = 'C:/Users/AKARAPX/Desktop/Corptesting/SOX Workday Report (DRS) 2023-11-13 05_56 CST.csv'
    table1 = 'CAWD_TX_Main'
    CreatedBy = 'AKARAPX'
  
    try:
        conn = create_engine('mssql+pyodbc://@' + servername + '/' + dbname + '?trusted_connection=yes&driver=ODBC+Driver+17+for+SQL+Server')

        #print('Connection successful')

        df_csvdata = pd.read_csv(Input_file, encoding="utf-8")

        columns_to_keep = ['Last Name','First Name','Middle Name',]
        df_csvdata = df_csvdata[columns_to_keep]
 
        df_csvdata.to_sql(table1, con = conn, schema = 'rpa', if_exists='append', index=False)
        print('Data inserted successfully')
   

    except Exception as e:
        print(f"An error occurred: {e}")

ImportDataToDB()

解决方案

1. 检测并使用CSV文件的实际编码

默认指定utf-8可能与文件实际编码不符,先用chardet库检测编码:

import chardet
with open(Input_file, 'rb') as f:
    encoding_result = chardet.detect(f.read())
print(f"检测到的文件编码: {encoding_result['encoding']}")

将检测到的编码传入pd.read_csv,例如:

df_csvdata = pd.read_csv(Input_file, encoding=encoding_result['encoding'])

2. 确保SQL Server表列使用Unicode类型

SQL Server中VARCHAR仅支持ASCII和特定代码页字符,必须改用NVARCHAR类型存储多语言字符:

  • 查看表列类型:
SELECT COLUMN_NAME, DATA_TYPE, CHARACTER_MAXIMUM_LENGTH 
FROM INFORMATION_SCHEMA.COLUMNS 
WHERE TABLE_NAME = 'CAWD_TX_Main' AND TABLE_SCHEMA = 'rpa';
  • 修改列类型为NVARCHAR(根据实际需求调整长度):
ALTER TABLE rpa.CAWD_TX_Main 
ALTER COLUMN [Last Name] NVARCHAR(255);

ALTER TABLE rpa.CAWD_TX_Main 
ALTER COLUMN [First Name] NVARCHAR(255);

ALTER TABLE rpa.CAWD_TX_Main 
ALTER COLUMN [Middle Name] NVARCHAR(255);

3. 优化SQLAlchemy连接配置

在连接字符串中显式指定Unicode支持,确保驱动正确传递字符:

conn = create_engine('mssql+pyodbc://@' + servername + '/' + dbname + '?trusted_connection=yes&driver=ODBC+Driver+17+for+SQL+Server&charset=utf8')

4. 强制指定数据类型(可选)

通过dtype参数强制Pandas使用Unicode类型写入数据库,避免自动推断错误:

from sqlalchemy.types import NVARCHAR

# 定义列对应的Unicode类型
dtype_config = {
    'Last Name': NVARCHAR(length=255),
    'First Name': NVARCHAR(length=255),
    'Middle Name': NVARCHAR(length=255)
}

# 写入时指定dtype
df_csvdata.to_sql(table1, con=conn, schema='rpa', if_exists='append', index=False, dtype=dtype_config)

内容的提问来源于stack exchange,提问作者Noffil Chougle

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 14:43:23