使用pymssql从SQL Server中取数并生成DataFrame及乱码解决方案

9 篇文章 0 订阅
6 篇文章 0 订阅

先说一个pymssql的坑及解决方案

这个坑叫“乱码”

SQL Server用的编码与Python的编码是不一样的,所以当使用Python从SQL Server读取数据的时候,有部分中文就会出现乱码。网上的很多解决方案,是这样的

"æ:°×ÁÖ¡¢±»".encode('latin1').decode('gbk')

但是我试了之后效果并不好,因为要读取大量的数据,这样就要把所有乱码的字符遍历一遍,严重影响速度,甚至有时候还会报错,然后我发现即使不报错,最后的乱码也还是没有解决。

解决方案1

找了很多地方,都没有人给出好的解决方案,翻了好几页之后,终于发现一个超级好用的方案,作者的思路也很有意思,就是把VARCHAT改成NVARCHAR,具体我就不写了,需要的自己去看把。链接在此
总之问题顺利解决了,贴一下最终的解决方案

select 
convert(nvarchar(50),Column_Name) as 'nvarchar_colum' 
from Table_Name
# 注意需要加个别名,否则字段名出来是空的

pymssql读取SQL Server的全代码

本人实测的代码,初学者照抄就行了


import pymssql as sql
import pandas as pd

def get_data():
    # 连接数据库
    conn = sql.connect(server,user,password, database)
    # 定义游标
    cursor = conn.cursor()
    cursor.execute(
    '''
    SELECT
    t2.CustomId,--客户编号
    t1.CreateTime,-- 创建时间
    t2.InfoSaleId,-- 创建人ID
    convert(nvarchar(50),T4.PersonName) as PersonName,--创建人姓名
    t5.DepartName, --所属部门
   	
    FROM table t1
    LEFT JOIN table t2 ON t1.Mob=t2.Mob
    LEFT JOIN table T4 ON T2.InfoSaleId=T4.PersonId
    LEFT JOIN table T5 ON T4.NewDepartId=T5.ERPDepartId
  
    WHERE
    t1.CreateTime > '2022-10-29'
    '''
    )

    # 获取字段名,通过循环生成
    title = []
    for i in range(len(cursor.description)):
        title.append(cursor.description[i][0])
    # print(len(title))

    # 获取表格内容
    data = []
    for row in cursor:
        data.append(list(row))
    conn.close()
    # pd.DataFrame(data).to_csv('test.csv',index=False,header=False,encoding='ANSI')
    # 最后生成一个DataFrame格式的文件输出
    return pd.DataFrame(data,columns=title)
get_data()

解决方案2

在存为CSV文件时,指定格式为ANSI即可

data.to_csv(file, index=False, header=False, encoding='ANSI')
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

White_Mountain

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值