我将用于web服务身份验证的JWT令牌存储在SQL Server数据库中。我已经将保存令牌的列声明为类型nvarchar(max),并将它们作为简单字符串传递到数据库中。插入令牌时,SQL Server会添加b'…'例如,假设我添加标记ABC123,则它存储b'ABC123'。
这导致了一些问题,因为当我将存储在数据库中的令牌与通过api传递的令牌进行比较时,由于额外的字符,比较失败(数据库似乎确实在存储的字符串中添加了小写b和两个单引号)。
我知道,一旦我从数据库中提取字符串,我就可以去掉b和引号,但我想知道SQL Server为什么要这样做,以及如何防止它这样做。
无论如何,任何见解都将不胜感激。
编辑:朝鲜国防部有可能这么做吗?这是我要插入的代码:
cnxn = pyodbc.connect("<connection string>")
crsr = cnxn.cursor()
crsr.execute("insert into jwt values (?,?)", [userId, str(auth_token)])
也许它混淆了Python 3和Python 2字符串?(我使用的是Python 3.6。)在这种情况下,我该如何修复它?
原来是python的"str"转换。jwt.encode返回一个字节数组,然后str将其转换为b'…'。解决方案是显式地解码字节,而不是使用str。所以我的新插入方法是:
crsr.execute("insert into jwt values (?,?)", [userId, auth_token.decode("utf-8")])
这确实是一个简单的解决方案,但却很晦涩。希望我的努力能帮助其他人!