首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> MySQL 資料庫 >> MySQL 綜合教學

從 Access 遷移 MySQL 實戰血淚錄:中文、日期、Blob、驅動 Bug 全方位避坑

     編輯:MySQL 綜合教學

專案因資料量暴增,決定將後端從 Access 遷移至 MySQL。理想很豐滿,現實卻是「問題叢生」:中文亂碼、日期格式衝突、文字截斷、Blob 存儲失敗、甚至官方驅動拋出 ArgumentOutOfRangeException。本文還原遷移全過程踩坑與解決方案,為同路人趟雷。

環境基線

  • 原系統:Access + C# (ADO.NET/OleDb)
  • 目標:MySQL 5.x + MySql.Data 驅動
  • 開發框架:自研持久層 (Pixysoft.Framework.Noebe)

一、中文亂碼:三級編碼統一戰

  1. my.ini 設 default-character-set=utf8(或 utf8mb4)
  2. 連接字串 加 Charset=utf8(5.0+ 免 useUnicode=true)
  3. 資料庫/表/欄位 全庫 CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci

花費數小時調通,核心是「全鏈路編碼一致」。

二、日期插入報錯:C# ToString() 含「上午/下午」

Access 接受 2024/1/15 上午 10:30:00,MySQL 直接報語法錯誤。
修正:持久層統一格式化為 yyyy-MM-dd HH:mm:ss(24 小時制),或改用參數化查詢傳 DateTime 物件(推薦)。

三、中文莫名截斷:Text 欄位只存一半

現象:英文正常,中文截斷。懷疑編碼導致位元組長度超限。
嘗試:重建資料庫、調整欄位型別 → 無效。
終極方案:DROP DATABASE 重建全庫(含 charset/collate),問題消失。推測為建庫時編碼不一致導致儲存邏輯異常。

四、Blob 圖片存儲失敗:檔案流 vs 位元組陣列

  • byte[] 直接寫入 → 成功
  • FileStream / 檔案路徑 → 失敗

變通:持久層統一將 Blob Base64 編碼 為字串存入 LONGTEXT,讀取時解碼。犧牲 33% 空間換取穩定性。

五、官方驅動拋 ArgumentOutOfRangeException:堆疊直指 MySQLString.WriteValue

System.ArgumentOutOfRangeException: 索引和長度必須引用該字符串內的位置。
參數名: length
   在 System.String.InternalSubStringWithChecks(...)
   在 MySQL.Data.Types.MySQLString.WriteValue(...)
   在 MySQL.Data.MySQLClient.MySQLParameter.Serialize(...)
   在 MySQL.Data.MySQLClient.Statement.BindParameters()
   在 MySQL.Data.MySQLClient.PreparableStatement.Execute()
   在 MySQL.Data.MySQLClient.MySQLCommand.ExecuteNonQuery()

現場:表 POS_SALESORDER,參數化插入。無法在 VS 中斷點調試(驅動內部拋出)。
推測:某字串參數長度超過欄位定義,或編碼轉換時位元組長度計算邏輯 Bug(MySql.Data 6.9.x 常見)。
規避:升級驅動至 8.0.x,或改用 MySqlConnector (NuGet) 替代官方驅動,後者開源、效能更好、Bug 更少。

六、開源生態吐槽:版本升級破壞相容、工具鏈繁瑣

  • Hibernate 升級連 namespace 都改,百萬 HelloWorld 失效
  • Eclipse 啟動 300MB、智能提示假死、Ant/Maven 配置地獄
  • Swing 界面慘不忍睹,靠 SWT (C 寫的) 才救場
  • 對比 VS2005:開箱即用、智能提示流暢、打包部署一鍵搞定

遷移 MySQL 本身是正確選擇,但工具鏈成熟度差距讓 .NET 開發者極度不適應。

七、遷移避坑總結清單

問題核心原因解決方案
中文亂碼編碼鏈路不一致my.ini + 連接字串 + 建庫語句 三級統一 utf8mb4
日期格式錯誤C# 預設含中文上午/下午參數化傳 DateTime 物件 / 統一格式化 yyyy-MM-dd HH:mm:ss
文字截斷建庫編碼不一致重建庫指定 charset/collate
Blob 存檔失敗驅動處理 Stream 邏輯缺陷Base64 編碼存 LONGTEXT / 升級驅動
驅動 ArgumentOutOfRange字串長度/編碼轉換 Bug升級 MySql.Data 8.0+ 或遷移 MySqlConnector

八、給決策者的建議

技術選型不僅看「功能支援」,更要評估「工具鏈成熟度、社區活躍度、遷移成本」。.NET 團隊引入 MySQL 時,建議:

  1. 優先選 MySqlConnector 替代官方驅動
  2. ORM 用 Dapper/EF Core Pomelo,避開 Hibernate 風格框架
  3. CI/CD 整合 mysql 命令列工具,而非依賴 Java 系遷移工具
  4. 預留 20% 時間處理編碼、驅動、工具鏈適配問題

遷移是痛苦的,但完成後擁有的高效能、開源免費、跨平台優勢,值得這場「渡劫」。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved