我们从解决一个实际问题的角度出发来说明。
在login数据库中有一张表Student,希望:
①使用python查询Student中S#的列值
②然后从键盘输入一个学号,找出从键盘中输入的学号与这些列值中的哪一个相匹配。
表Student以及其各个列的数据类型如下:
首先查询Student中S#的列值:
import pymssql
sqlQuery="select S# from Student"
conn = pymssql.connect(server='DESKTOP-LYZ', user='sa', password='12345', database='login')
cursor = conn.cursor()
cursor.execute(sqlQuery)
results = cursor.fetchall()
#print(results)#希望输出的是列值,而不是记录,因此不直接输出results
for k in range(len(results)):
print(results[k][0])
S#的列值已经查询完毕了。按照一般的想法,只需要从键盘输入一个学号,挨个和上面的8个列值比较,如果二者相等,任务就完成了,看起来十分轻松加愉快。
Snum=input('输入学号:')
print('results[k][0] Snum 匹配是否成功')
for k in range(len(results)):
if Snum == results[k][0]:
print(' '+results[k][0]+' '+Snum+" 匹配成功,成功匹配第",end='')
print(k+1,end='')
print("个学号")
else:
print(' '+results[k][0]+' '+Snum+" 匹配失败")
输入98040202,运行程序
居然显示98040202和8个列值全部匹配失败!!第五行这两个字符串明明是一样的啊!
——不一样!
问题出在Student表的数据类型上,回到SQL Server数据库,打开Student表的“设计”选项。
在Student表的S#的数据类型中,可以看到S#的数据类型为nchar(10)
这个10的意义不仅是规定S#的长度最多为10,同时如果S#长度小于10,不足10的部分会补足空格。又因为所有的学号都是8为,也就是说第一步查询到的S#不是“98030101”、“98030102”…,而是“9803010__”、“98030102__”…
在第二步查询匹配的时候,以输入Snum为“98040202”为例,显然“98040202”与“98040202__”是两个不同的字符串,不满足Snum == results[k][0],因此全部显示匹配失败。
为了成功匹配,需要将来自数据库的字符串中空格去掉,可以利用rstrip()函数
rstrip()函数的功能是去掉字符串末尾的特定字符,当括号为空时默认去掉为空格
例如,去掉“1000****”中的*:
num="1000****"
print(num.rstrip('*'))
输出结果为“1000”
去掉“1000 ”中的空格
num="1000 "
print(num.rstrip())
现在我们将之前代码中的
Snum == results[k][0]
替换为
Snum == results[k][0].rstrip()
执行程序,输入“98040202”