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、此段代码带有中文的筛选条件,测试如下图:
请问一下,我这种情况如何处理
分割线………………………………………………………………………………………………………………………………………
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情况:
执行sqltext="select top 10 * from RWDB.dbo.ST_STBPRP_B"时,print情况:
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语句时会返回空值?
可以尝试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://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语句测试连接,以确保连接到数据库并能够执行其他语句。