为什么delete语句在mysql workbench和php/pdo中运行时,在mysql connector/net中会无声地失败?

tuwxkamq  于 2021-06-18  发布在  Mysql
关注(0)|答案(1)|浏览(331)

我有一个mariadb数据库,其中包含一个表,其中包含运行在centos7服务器上的移动设备(android和ios)的信息,该服务器使用mono-jit编译器版本5.4.0.201和mysql connector/net(最新版本8.0.13)。
一切都很好,只是我不能通过connector/net从devices表中删除基于push令牌的设备。表定义如下:

CREATE TABLE `Devices` (
  `idDevices` int(11) NOT NULL AUTO_INCREMENT,
  `notificationId` varchar(160) DEFAULT NULL,
  `deviceId` varchar(64) NOT NULL,
  `isAndroid` tinyint(1) NOT NULL,
  `deviceModel` varchar(64) DEFAULT NULL,
  `appMajor` tinyint(4) DEFAULT NULL,
  `appMinor` tinyint(4) DEFAULT NULL,
  PRIMARY KEY (`idDevices`),
  UNIQUE KEY `isAndroid` (`isAndroid`,`deviceId`),
  UNIQUE KEY `notificationId_UNIQUE` (`isAndroid`,`notificationId`),
  KEY `appVersion` (`appMajor`,`appMinor`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

从mono应用程序运行delete语句时,不会发生异常,但executenonquery()返回的int值始终为0,并且没有从表中删除任何行。mariadb.log中未记录任何错误或警告(log\u warning=4)。如果我将完全相同的sql语句复制到mysql workbench并在那里执行该语句,则会按预期删除行。如果我创建一个php脚本并使用pdo连接到同一个db,那么它也可以正常工作。所有三个测试用例都使用相同的用户(root)。所以这似乎是一个连接器/网络特有的问题

var tokenCount = 0;
            var sql = new StringBuilder ("DELETE FROM Devices WHERE isAndroid = 0 AND notificationId IN ('");

            while (...) {
                sql.Append (token);
                sql.Append ("','");
                tokenCount++;
            }

            sql.Length -= 2;
            sql.Append (')');

            using (var connection = new MySqlConnection (connectionString)) {
                connection.Open ();
                using (var command = new MySqlCommand (sql.ToString (), connection)) {
                    var affectedRows = command.ExecuteNonQuery ();
                    if (affectedRows != tokenCount) {
                        //Always logs affectedRows(0)
                        log.Warn ($"Remove tokenCount({tokenCount}) != affectedRows({affectedRows}). sql={sql}");
                    }
                }
            }

更新:我启用了general\u log,我看到正确的db被初始化,语句被运行-但是表没有改变!日志输出:

3 Init DB   mydb
        3 Query DELETE FROM Devices WHERE isAndroid = 0 AND notificationId IN ('002B1C477DB4F20868D157A806DF70E05D61D3950562C03E092707CA9C5CCF23')

update#2:我尝试使用相同的where子句将delete语句更改为select语句,结果没有返回任何行。因此,notificationid上的匹配似乎出于某种原因不起作用。可能是编码问题吗?为什么它可以在其他客户机上工作,而不能在我的连接器/网络客户机上工作?

omjgkv6w

omjgkv6w1#

好的,经过几个小时的调试,我发现了这个问题。结果发现它与连接器/网络无关。问题在于我是如何构造令牌的,我意外地添加了一些无法在log4net日志中打印的字符,因此sql在客户端看起来是正常的——但是发送到数据库服务器的实际sql字符串包含无效令牌!

相关问题