mysql - 经典 ASP 遗留系统对 MySQL 8.0 中的所有整数返回 0

标签 mysql asp-classic odbc

我们正在为一家公司处理系统迁移,同时将他们的 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 在数据库上手动运行存储过程时,我们会看到预期的结果,如下所示。

enter image description here

我们使用 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 ;

表设计图像,显示应作为存储过程调用的一部分返回的简单整数列

enter image description here

最佳答案

我在我的数据库中确认了同样的问题。我尝试将 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/

相关文章:

php - 我的 PHP 代码更新一张表时出现错误

iis-7 - 重写规则以重写所有 EXCEPT 文件扩展名

java - 64 位 Java 无法通过 ODBC Access 32 位 MS Access 数据库

.net - 创建 Pervasive 数据库 Entity Framework 的步骤

php - 为什么我无法获取搜索结果?

mysql - 如何使用 Group By 和整个列来计算 Distinct

mysql - Magento SQL 查询

web-services - 在经典 ASP 中使用 SOAP Web 服务

javascript - 如何解析位于不同 Web 服务器上的 XML 文件?

sql-server - 如何在 Linux 中通过 Perl 脚本访问 SQL Server 数据库?