python获取数据库数据为空值



 def enshidata(self):
        sqlenshi ="select top 10 r.STCD,sum(r.DRP) as DRP_SUM ,b.STNM,b.STLC,b.ADMAUTH from RWDB.dbo.ST_PPTN_R r left join RWDB.dbo.ST_STBPRP_B b on r.STCD=b.STCD where r.TM >= DATEADD(hour,-1,GETDATE()) and b.ADMAUTH = '建始县' group by r.STCD,b.STNM,b.STLC,b.ADMAUTH order by sum(r.DRP) desc".encode("GBK")

           # 执行语句
        self.cursor.execute(sqlenshi)
        print(self.cursor.rowcount)
        # 获取所有记录
        resultses = self.cursor.fetchall()
        print(sqlenshi)
        print(resultses)
        return resultses


1、数据库为sqlserver 2008,字符集为Chinese_PRC_CI_AS,查了一下只支持GBK或者GB2312
2、连接数据库的代码connect中charset为GBK
3、有其他sql语句(无中文筛选条件)都正常
4、此条sql语句在数据库中无误,有返回数据;其他的代码也检查过,无错误
5、此段代码带有中文的筛选条件,测试如下图:

img

请问一下,我这种情况如何处理

分割线………………………………………………………………………………………………………………………………………

2023.3.2更新
经过网友们的帮助,我暂时解决了编码的问题,打印输出sql语句,中文字段会正常显示。但是还是有问题,sql语句还是不返回数据,我换成简单的sql语句会返回数据,下面我贴出print的照片和sql语句在数据库的执行情况

#coding=GBK
import pymysql
import pymssql

class Mysql(object):
    def __init__(self):
        try:
            self.db = pymssql.connect(host='11.XX.XX.20',
                                      port='XX',
                                      user='XX',password='XXXX',
                                      database='XXXX',
                                      charset='GBK')
            self.cursor =self.db.cursor()
            print('连接成功')
        except:
            print('连接失败')

 def enshidata(self):
        sqltext="select top 10 * from RWDB.dbo.ST_STBPRP_B"
        sqlenshi ="select top 10 r.STCD,sum(r.DRP) as DRP_SUM ,b.STNM,b.STLC,b.ADMAUTH from RWDB.dbo.ST_PPTN_R r left join RWDB.dbo.ST_STBPRP_B b on r.STCD=b.STCD where r.TM >= DATEADD(hour,-1,GETDATE()) and b.ADMAUTH ='建始县' group by r.STCD,b.STNM,b.STLC,b.ADMAUTH order by sum(r.DRP) desc"

           # 执行语句
        self.cursor.execute(sqlenshi)
        print(self.cursor.rowcount)
        # 获取所有记录
        resultses = self.cursor.fetchall()
        print(sqlenshi)
        print(resultses)
        return resultses

执行sqlenshi ="select top 10 r.STCD,sum(r.DRP) as DRP_SUM ,b.STNM,b.STLC,b.ADMAUTH from RWDB.dbo.ST_PPTN_R r left join RWDB.dbo.ST_STBPRP_B b on r.STCD=b.STCD where r.TM >= DATEADD(hour,-1,GETDATE()) and b.ADMAUTH ='建始县' group by r.STCD,b.STNM,b.STLC,b.ADMAUTH order by sum(r.DRP) desc"时,print情况:

img

执行sqltext="select top 10 * from RWDB.dbo.ST_STBPRP_B"时,print情况:

img

select top 10 r.STCD,sum(r.DRP) as DRP_SUM ,b.STNM,b.STLC,b.ADMAUTH from RWDB.dbo.ST_PPTN_R r left join RWDB.dbo.ST_STBPRP_B b on r.STCD=b.STCD where r.TM >= DATEADD(hour,-1,GETDATE()) and b.ADMAUTH ='建始县' group by r.STCD,b.STNM,b.STLC,b.ADMAUTH order by sum(r.DRP) desc在数据库中执行情况:

img

现目前的情况,是为什么我执行带有中文字符串的sql语句时会返回空值?

可以尝试utf8

conn 设置 charset="utf-8" 试下



conn = pymssql.connect(host='localhost', server="****", port="1433", user="sa", password="********", database="test",
                       charset="utf-8", autocommit=False)

试下重新编码和解码:



        sqlenshi ="select top 10 r.STCD,sum(r.DRP) as DRP_SUM ,b.STNM,b.STLC,b.ADMAUTH from RWDB.dbo.ST_PPTN_R r left join RWDB.dbo.ST_STBPRP_B b on r.STCD=b.STCD where r.TM >= DATEADD(hour,-1,GETDATE()) and b.ADMAUTH = '建始县' group by r.STCD,b.STNM,b.STLC,b.ADMAUTH order by sum(r.DRP) desc".encode("latin-1", errors="ignore").decode("gbk", errors="ignore")

参考GPT和自己的思路,根据您提供的信息,可以初步排除连接数据库的问题。建议您检查以下几点:

1 检查您使用的数据库和表是否存在,以及您查询的字段是否存在,表名和字段名是否拼写正确。
2 检查您的查询条件是否正确,如日期是否正确、中文是否乱码等。
3 检查您的查询语句是否有问题,建议您将查询语句复制到 SQL Server Management Studio(SSMS)中进行测试,以确认查询语句是否正确。
4 检查您的查询结果是否存在 NULL 值,如果存在,可能会导致 Python 获取的结果为空。
5 检查您的 Python 代码是否存在问题,建议您在执行 cursor.fetchall() 方法之前,添加 cursor.description 的打印输出,以确认返回的数据结构是否正确。
另外,您可以尝试在执行 SQL 语句时,将其字符串格式转换为 Unicode 编码格式,例如:

sqlenshi = u"select top 10 r.STCD,sum(r.DRP) as DRP_SUM ,b.STNM,b.STLC,b.ADMAUTH from RWDB.dbo.ST_PPTN_R r left join RWDB.dbo.ST_STBPRP_B b on r.STCD=b.STCD where r.TM >= DATEADD(hour,-1,GETDATE()) and b.ADMAUTH = '建始县' group by r.STCD,b.STNM,b.STLC,b.ADMAUTH order by sum(r.DRP) desc"

最后,建议您将问题拆分,逐步调试代码,以找出问题所在。

sql语句在中文前加上N试试:

sqlenshi ="select top 10 r.STCD,sum(r.DRP) as DRP_SUM ,b.STNM,b.STLC,b.ADMAUTH from RWDB.dbo.ST_PPTN_R r left join RWDB.dbo.ST_STBPRP_B b on r.STCD=b.STCD where r.TM >= DATEADD(hour,-1,GETDATE()) and b.ADMAUTH = N'建始县' group by r.STCD,b.STNM,b.STLC,b.ADMAUTH order by sum(r.DRP) desc".encode("GBK")

有帮助的话,请点采纳~

https://www.baidu.com/link?url=3bWrjGJESUm0FeUtB8uag7EfvSnIb6c_OIgxwi9RWGIXkWvrvubH13Z18U7c0eFq&wd=&eqid=fdc22d67000372bc0000000263fdda17

可以借鉴下
https://blog.csdn.net/Daisy_Wang777/article/details/125220119

你的Python文件另存为格式为GBK的文件,再次执行试试!

可以尝试在连接MySQL时添加charset='utf8'参数,指定字符集为UTF-8,例如:

import pyodbc

cnxn = pyodbc.connect("DRIVER={MySQL ODBC 5.3 Unicode Driver};SERVER=localhost;PORT=3306;DATABASE=mydatabase;USER=myusername;PASSWORD=mypassword;CHARSET=utf8")

如果还是不行,可以在查询语句前面加上 SET NAMES utf8;,例如:

sqlenshi = "SET NAMES utf8; select top 10 r.STCD,sum(r.DRP) as DRP_SUM ,b.STNM,b.STLC,b.ADMAUTH from RWDB.dbo.ST_PPTN_R r left join RWDB.dbo.ST_STBPRP_B b on r.STCD=b.STCD where r.TM >= DATEADD(hour,-1,GETDATE()) and b.ADMAUTH = '建始县' group by r.STCD,b.STNM,b.STLC,b.ADMAUTH order by sum(r.DRP) desc".encode("GBK")

该回答引用ChatGPT

根据你提供的信息,问题可能是编码问题。以下是建议:

1、确认数据库表的编码,以确保连接字符串的编码和数据库表的编码匹配。

2、你已经在连接字符串中指定了GBK编码,但是你的SQL语句中也有中文,这可能会导致编码问题。你可以尝试将SQL语句中的中文转换为相应的编码,然后再将其编码为GBK。例如,如果你的中文字符集是GB2312,你可以尝试以下代码:


sqlenshi = "select top 10 r.STCD,sum(r.DRP) as DRP_SUM ,b.STNM,b.STLC,b.ADMAUTH from RWDB.dbo.ST_PPTN_R r left join RWDB.dbo.ST_STBPRP_B b on r.STCD=b.STCD where r.TM >= DATEADD(hour,-1,GETDATE()) and b.ADMAUTH = '建始县' group by r.STCD,b.STNM,b.STLC,b.ADMAUTH order by sum(r.DRP) desc".encode('GB2312').decode('GBK')


3、确认你的SQL语句是否正确。你可以使用SQL Server Management Studio等工具执行SQL语句,以确保它可以正常工作并返回预期的结果。

4、确认你的数据库连接是否正确。你可以使用其他SQL语句测试连接,以确保连接到数据库并能够执行其他语句。