我们正在为一家公司处理系统迁移,同时将他们的 MySQL 数据库从 5.1 升级到 8.0,并且遇到了一个奇怪的问题,即所有整数字段现在都返回为 0,而不是数据库中保存的值。数据库。这些代码都是 10 年前由另一家使用 Classic ASP 的公司编写的。
显示使用的提供程序/连接器的连接字符串:
'objConn.Open "Driver={MySQL ODBC 8.0 ANSI Driver}; Server=XXXX; Database=XXXX; UID=xxxxxx; PWD=xxxxxx; charset=UTF8;"'
下面是用于运行存储过程的代码:
dim objGetFromUsernamePassword, ObjRsLogin
Set objGetFromUsernamePassword = Server.CreateObject("ADODB.Command")
With objGetFromUsernamePassword
.ActiveConnection = objConn
.CommandType = adCmdStoredProc
.CommandText = "sp_LoginUsernamePassword"
.Parameters.Append .CreateParameter("$strUserName", adVarChar, adParamInput,256, strUserName)
.Parameters.Append .CreateParameter("$strPassword", adVarChar, adParamInput,20, strPassword)
Set ObjRsLogin = objGetFromUsernamePassword.Execute
end with
set objGetFromUsernamePassword = nothing
if ObjRsLogin.EOF then
Set objRsLogin = nothing
response.write "no records"
response.redirect "login.asp?strLogin=fail"
end if
response.write CLng(ObjRsLogin.fields.Item(0).value)
response.write "-"
For Each fld In ObjRsLogin.Fields
msg = msg & fld.Name & "|"
msg = msg & fld.Value & "|"
msg = msg & fld.Type & "|"
Next
response.write msg
上面这段代码在网页上的输出结果如下。如果有点难以理解,我们深表歉意,但它应该返回列名称 |值,还包括引用类型的数字:
0-pkLoginID|0|3|strLoginName|[email protected]|200|strPassword|97bd19e019838ed960a7e9b21ac7d0f0dccc0958|200|strUserName|testlogin|200|strSessionID|1053793318|200|fkLoginTypeID|0|3|fkParentID|0|3|fkDepartmentID|0|3|strEmail|[email protected]|200|txtNotePad||201|fkUserLevelID|0|3|isActive|0|16|fkContractorID||3|tb_test|0|3|
当使用 MySQL Workbench 在数据库上手动运行存储过程时,我们会看到预期的结果,如下所示。
我们使用 MySQL ODBC 8.0 连接器,并在 64 位 Windows Server 2012 虚拟机上运行代码。
我目前有点无法解释这里发生的事情。
编辑以解释为什么重复问题的评论没有回答这个问题
存储过程如下:
CREATE DEFINER=`root`@`%` PROCEDURE `sp_LoginUsernamePassword`($strUserName varchar(256), $strPassword varchar(20))
DETERMINISTIC
SQL SECURITY INVOKER
BEGIN
SELECT * From tb_login WHERE (strLoginName = $strUserName ) and (strPassword = sha1($strPassword));
END$$
DELIMITER ;
表设计图像,显示应作为存储过程调用的一部分返回的简单整数列
最佳答案
我在我的数据库中确认了同样的问题。我尝试将 INT 数据类型更改为 DOUBLE,问题消失了(从而确认问题仅影响 INT 数据类型),然后我获取数据库,创建副本并开始删除其他列,问题消失。我发现,当查询中的列的数据类型为 LONGTEXT、MEDIUMTEXT、TEXT、TINYTEXT、JSON 或 BLOB 时,无论数据库中存储的值如何,都会导致 INT 列为 0。我已向 MySQL ( https://bugs.mysql.com/bug.php?id=97191 ) 提交了一份错误报告,其中显示了如何使用 MySQL 8.0.17、ODBC 驱动程序 8.0.17(我测试过)在我的系统 (Server 2019/IIS 10) 上重现该问题的示例5.3.13(32 位和 64 位,结果相同)和经典 ASP/VBScript。
据我所知,为了在使用经典 ASP 中的准备好的语句时正确显示 INT 值,需要从查询中排除任何 TEXT/BLOB/JSON 数据类型。
我想说这是一个重大错误......
关于mysql - 经典 ASP 遗留系统对 MySQL 8.0 中的所有整数返回 0,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57390306/