萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 程式設計 >  >> 資料庫 >> MySQL 教學

解決 MySQL Blob 圖片存儲「索引超出陣列界限」Bug

問題現象

在 .NET 專案中使用 MAction 框架向 MySQL Blob 欄位寫入圖片二進位資料時,拋出「索引超出了陣列界限」例外。同樣程式碼對 SQL Server、Oracle 等資料庫卻正常運作。

排查過程

  1. 懷疑 MySQL Connector/NET 版本問題,嘗試降級至 6.2.3 版,無效。
  2. 逐行除錯發現:跳過對 DbParameter.Size 賦值時,寫入成功。
  3. 對比其他資料庫,發現只有 MySQL 在參數為 DbType.Binary 時,設定 Size 會觸發此 Bug。

根因分析

框架通用參數建立邏輯如下:

DbParameter para = factory.CreateParameter();
para.ParameterName = name;
para.Value = value ?? DBNull.Value;
para.DbType = dbType;
if (size > -1) para.Size = size;  // ← 這行導致 MySQL Blob 寫入失敗
para.Direction = direction;

MySQL 驅動在處理 DbType.Binary 參數的 Size 屬性時存在缺陷,導致內部陣列越界。

修正方案

在設定 Size 前排除二進位類型:

if (dbType != DbType.Binary && size > -1)
{
    para.Size = size;
}

經測試,SQL Server、Oracle、PostgreSQL 等均不受影響,僅 MySQL 需特殊處理。

經驗總結

  • 多資料庫支援框架難免遇到驅動層級差異,針對性修補勝過追求完美統一。
  • Blob/Clob 大物件欄位操作時,優先驗證驅動對 Size、Precision、Scale 等屬性的相容性。
  • 單元測試應覆蓋各資料庫的二進位讀寫場景,及早暴露此類問題。

此修正已應用於生產環境,穩定運行超過兩年,未再出現同類異常。

copyright © 萬盛學電腦網 all rights reserved