兩種連接架構對比
| 維度 | MySQL C API (libmysql) | MyODBC (ODBC 驅動) |
| 適用語言 | C/C++、Delphi、VB (需封裝) | 所有支援 ODBC 的語言 (VB、VC、Delphi、C#、Python、ASP 等) |
| 部署複雜度 | 需分發 libmysql.dll + 開發庫 | 僅需 myodbc.dll + 系統 DSN 設定 |
| 效能 | 原生協議,延遲最低 | ODBC 層轉換,微小開銷 |
| 跨資料庫移植 | 困難,綁定 MySQL | 極易,只改 DSN/連接字串 |
| ASP/經典 Web 支援 | 不支援 (無 COM) | 原生支援 |
MyODBC 5.x 快速部署(僅需 300KB DLL)
1. 取得核心檔案
- 官網下載
mysql-connector-odbc-5.x-win32.msi 完整安裝包(含 DLL、安裝精靈、幫助文件)
- 或從安裝包解壓 僅需
myodbc5.dll (Unicode) / myodbc5a.dll (ANSI) + myodbc5S.dll (Setup DLL)
2. 手動註冊驅動(免安裝模式)
; myodbc_reg.reg — 雙擊導入註冊表
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SOFTWARE\ODBC\ODBCINST.INI\MySQL ODBC 5.3 Unicode Driver]
"Driver"="C:\\Windows\\System32\\myodbc5.dll"
"Setup"="C:\\Windows\\System32\\myodbc5S.dll"
"DriverODBCVer"="03.50"
"FileUsage"="0"
"ConnectFunctions"="YYY"
"APILevel"="1"
"CPTimeout"="120"
[HKEY_LOCAL_MACHINE\SOFTWARE\ODBC\ODBCINST.INI\ODBC Drivers]
"MySQL ODBC 5.3 Unicode Driver"="Installed"
; 64位系統須同時寫入 Wow6432Node
[HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\ODBC\ODBCINST.INI\MySQL ODBC 5.3 Unicode Driver]
"Driver"="C:\\Windows\\SysWOW64\\myodbc5.dll"
"Setup"="C:\\Windows\\SysWOW64\\myodbc5S.dll"
... (同上)
3. 建立系統 DSN(供所有使用者/服務使用)
; dsn_mysql.reg
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SOFTWARE\ODBC\ODBC.INI\MySQL_Test]
"Driver"="C:\\Windows\\System32\\myodbc5.dll"
"SERVER"="192.168.1.100"
"PORT"="3306"
"DATABASE"="mydb"
"USER"="app_user"
"PASSWORD"="EncryptedOrPrompt"
"OPTION"="3" ; 1=FoundRows, 2=Compress, 4=NamedPipe, 8=NoPrompt, 16=UseCursorLib...
"CHARSET"="utf8mb4"
"INITSTMT"="SET time_zone='+08:00'"
[HKEY_LOCAL_MACHINE\SOFTWARE\ODBC\ODBC.INI\ODBC Data Sources]
"MySQL_Test"="MySQL ODBC 5.3 Unicode Driver"
各語言調用範例
Visual Basic 6 / VBA / ASP (經典)
' ADO 連接
Dim cn As New ADODB.Connection
cn.ConnectionString = "DSN=MySQL_Test;UID=app_user;PWD=secret;"
cn.Open
' 無 DSN 連接字串
cn.Open "Driver={MySQL ODBC 5.3 Unicode Driver};" & _
"Server=192.168.1.100;Port=3306;Database=mydb;" & _
"Uid=app_user;Pwd=secret;Charset=utf8mb4;Option=3;"
' 執行查詢
Dim rs As New ADODB.Recordset
rs.Open "SELECT id, name FROM users WHERE status=1", cn, adOpenForwardOnly, adLockReadOnly
Do Until rs.EOF
Debug.Print rs("id"), rs("name")
rs.MoveNext
Loop
rs.Close: cn.Close
Visual C++ (MFC/ATL) - ADO 智慧指標
#import "msado15.dll" no_namespace rename("EOF", "adoEOF")
_ConnectionPtr pConn;
HRESULT hr = pConn.CreateInstance(__uuidof(Connection));
pConn->Open("DSN=MySQL_Test", "app_user", "secret", adConnectUnspecified);
_RecordsetPtr pRs = pConn->Execute("SELECT * FROM products WHERE price > ?",
vtMissing, adCmdText); // 參數化查詢需用 Command 物件
// 參數化範例
_CommandPtr pCmd; pCmd.CreateInstance(__uuidof(Command));
pCmd->ActiveConnection = pConn;
pCmd->CommandText = "SELECT * FROM products WHERE price > ?";
pCmd->Parameters->Append(pCmd->CreateParameter("p1", adDouble, adParamInput, 0, 100.0));
pRs = pCmd->Execute();
Delphi (FireDAC / ADO / dbExpress)
{ FireDAC - 推薦現代寫法 }
FDConnection1.Params.DriverID := 'ODBC';
FDConnection1.Params.Add('ODBCAdvanced=DSN=MySQL_Test;UID=app_user;PWD=secret;');
FDConnection1.Connected := True;
FDQuery1.SQL.Text := 'SELECT * FROM orders WHERE order_date >= :dt';
FDQuery1.ParamByName('dt').AsDateTime := Now - 30;
FDQuery1.Open;
{ ADO 組件 }
ADOConnection1.ConnectionString := 'DSN=MySQL_Test;UID=app_user;PWD=secret;';
ADOQuery1.SQL.Text := 'CALL sp_get_sales(?, ?)';
ADOQuery1.Parameters.ParamByName('p1').Value := 2024;
ADOQuery1.Open;
C# / .NET (System.Data.Odbc)
using (var conn = new OdbcConnection("DSN=MySQL_Test;Uid=app_user;Pwd=secret;"))
{
conn.Open();
using (var cmd = new OdbcCommand("INSERT INTO logs(msg, lvl) VALUES(?, ?)", conn))
{
cmd.Parameters.Add("@msg", OdbcType.VarChar).Value = "測試訊息";
cmd.Parameters.Add("@lvl", OdbcType.Int).Value = 1;
cmd.ExecuteNonQuery();
}
}
進階配置與疑難排解
連接選項 (OPTION 位元組合)
| 值 | 常數名 | 功能 |
| 1 | FOUND_ROWS | 回傳影響行數而非匹配行數 |
| 2 | COMPRESS | 啟用壓縮協議 (慢速網路有效) |
| 8 | NO_PROMPT | 禁止彈出對話框 (服務/批次必備) |
| 16 | USE_CURSOR_LIB | 強制使用 ODBC 游標庫 |
| 32 | NO_SCHEMA | 禁止 SHOW TABLES 等 schema 查詢 |
| 64 | READ_ONLY | 唯讀連線 |
| 128 | AUTO_RECONNECT | 自動重連 (MySQL 5.7+ 已內建) |
| 256 | MULTI_STATEMENTS | 允許多語句批次執行 |
| 65536 | SSL_VERIFY_SERVER_CERT | 驗證 SSL 憑證 |
常用組合:Option=3 (FoundRows+Compress) 或 Option=67 (FoundRows+Compress+NoPrompt+ReadOnly)
常見錯誤與對策
- 「Data source name not found」 → DSN 名稱拼寫錯誤、32/64 位不匹配 (需用
odbcad32.exe 對應版本建立)
- 「Authentication plugin 'caching_sha2_password' not supported」 → MyODBC 5.3 不支援 MySQL 8.0 新認證,升級 8.0 驅動或改用
mysql_native_password
- 中文亂碼 → 連接字串加
Charset=utf8mb4、資料庫/表/欄位全鏈路 utf8mb4、驅動版本 ≥ 5.3
- 「Lost connection」間歇斷線 → 開啟
Option=128 自動重連、調大 wait_timeout、檢查防火牆空閒超時
總結建議
- 新專案優先用原生連接器:.NET 用 MySqlConnector、Java 用 Connector/J、Python 用 PyMySQL、Go 用 go-sql-driver/mysql
- 維護舊系統/跨資料庫/ASP 必須用 ODBC:採用 MySQL 官方 8.0 系列驅動,完整支援 utf8mb4、TLS 1.2、caching_sha2_password
- 生產環境務必使用系統 DSN + 加密儲存密碼 (Windows Credential Manager / DPAPI / Vault),杜絕明文寫在程式碼/註冊表