MySQLCommand ExecuteReader行大小太大,在CLI上查询工作正常

时间:2018-07-12 22:20:28

标签: mysql .net

我们的数据库服务器在RedHat 6.10上运行MySQL 5.6.40

我们的运行Windows Server 2008 R2且运行IIS 7.5.X的Web服务器

我们最近注意到,当从.NET表单连接到我们的数据库并运行大型SQL插入语句时,我们的代码将引发异常:

Row size too large (> 8126). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help. In current row format, BLOB prefix of 768 bytes is stored inline.   at MySql.Data.MySqlClient.MySqlStream.ReadPacket()
   at MySql.Data.MySqlClient.NativeDriver.GetResult(Int32& affectedRow, Int64& insertedId)
   at MySql.Data.MySqlClient.Driver.NextResult(Int32 statementId, Boolean force)
   at MySql.Data.MySqlClient.MySqlDataReader.NextResult()
   at MySql.Data.MySqlClient.MySqlCommand.ExecuteReader(CommandBehavior behavior)
   at MySql.Data.MySqlClient.MySqlCommand.ExecuteNonQuery()

是的,失败的查询是一个大型查询,并且查询中的文本大小超过8K,但是奇怪的是,对于来自MySQL CLI的相关表运行相同的确切查询,会产生一个成功插入。如果行大小有问题,那么在那也应该失败,对吗?

我想知道是否有人看到过这个问题。我现在唯一能想到的就是MySQL .NET dll的错误?从代码中,我们引用的dll版本比可用版本旧,但是其他所有东西都在起作用,因此我们不愿意安装较新的版本,而必须对我们的网站/应用程序进行完整的重新测试。我已经读过很多其他有关此错误的文章,这些错误提示innoDB页面大小,配置等问题,但是如果查询在CLI上运行正常,我认为这将排除innoDB错误。

我绝对不是DBA,所以请保持友善。

1 个答案:

答案 0 :(得分:0)

Richardissimo,我希望我能。由于系统的性质,我不能。

我们确实发现了问题。我回到了DBA,在正确条件下,CLI的查询实际上是失败了。事实证明,问题与使用 MySQL CONCAT 将UTF8字符串数据连接到拉丁数据库有关:

例如:UPDATE MYTABLE设置历史= CONCAT(历史,“新数据”)在哪里....

[失败]

我们将数据库转换为UTF8并进行了重新测试,问题消失了。我仍然不完全理解为什么数据库抛出“行大小太大”错误,但是至少我知道是什么原因造成的。

在拉丁数据库上执行的数百万个SQL事务中,使用CONCAT的查询是唯一有问题的查询,这也是很奇怪的。