MySQL ODBC 8.0 Unicode Driver / MySQL ODBC 8.0 ANSI Driver。

odbcad32.exe)。MySQL_Link (自訂,後續連結伺服器引用)192.168.0.119)root)asteriskcdrdb)



MYSQL_LINK (自動大寫)MySQL (任意)MySQL_Link (步驟 2 的 DSN 名稱)


-- 刪除舊同名連結伺服器 (若存在)
IF EXISTS (SELECT * FROM sys.servers WHERE name = 'MYSQL_LINK2')
EXEC sp_dropserver 'MYSQL_LINK2', 'droplogins';
GO
-- 建立連結伺服器
EXEC sp_addlinkedserver
@server = 'MYSQL_LINK2', -- 連結伺服器名稱
@srvproduct = 'MySQL', -- 產品名稱
@provider = 'MSDASQL', -- 固定:OLE DB for ODBC
@datasrc = NULL,
@location = NULL,
@provstr = 'DRIVER={MySQL ODBC 8.0 Unicode Driver};SERVER=192.168.0.119;DATABASE=asteriskcdrdb;UID=root;PWD=root;PORT=3306;',
@catalog = NULL;
GO
-- 設定遠端登入認證
EXEC sp_addlinkedsrvlogin
@rmtsrvname = 'MYSQL_LINK2',
@useself = 'FALSE', -- 不使用當前登入上下文
@rmtuser = 'root', -- MySQL 遠端用戶
@rmtpassword = 'root'; -- MySQL 遠端密碼
GO
關鍵點:@provider='MSDASQL' 固定不變;@provstr 中 DRIVER={...} **必須與 ODBC 驅動名稱完全一致** (含大小寫、空格)。
-- 查詢 MySQL 表
SELECT * FROM OPENQUERY(MYSQL_LINK, 'SELECT * FROM cdr_ex LIMIT 10');
-- 帶參數查詢 (需動態 SQL)
DECLARE @sql NVARCHAR(MAX) = 'SELECT * FROM OPENQUERY(MYSQL_LINK, ''SELECT * FROM cdr_ex WHERE calldate > ''''2024-01-01'''' '')';
EXEC sp_executesql @sql;
SELECT * FROM MYSQL_LINK...asteriskcdrdb.cdr_ex; -- 伺服器...目錄.結構.表
-- 注意:MySQL 無結構概念,中間以點號佔位
-- 透過 OPENQUERY 寫入
INSERT OPENQUERY(MYSQL_LINK, 'SELECT id, name FROM cdr_ex')
VALUES (999, 'Test From SQL Server');
-- 異質性交易 (分散式交易) 需啟用 MSDTC
BEGIN DISTRIBUTED TRANSACTION;
INSERT INTO LocalTable ...;
INSERT OPENQUERY(MYSQL_LINK, 'SELECT ...') VALUES (...);
COMMIT TRANSACTION;
| 錯誤現象 | 原因 | 解決 |
|---|---|---|
| 「找不到提供者」/「無法初始化資料來源」 | 安裝 32 位驅動但 SQL Server 為 64 位 | **必裝 64 位 ODBC 驅動** |
| 「驅動程式的 SQLSetConnectAttr 失敗」 | DSN 設定錯誤 / 密碼含特殊字元 | 檢查 DSN 測試、密碼用單引號包裹 |
| 中文亂碼 | 使用 ANSI 驅動 / 字符集不匹配 | 改用 Unicode 驅動、確認 MySQL character_set_server=utf8mb4 |
| 查詢極慢 | 四部分命名拉回全表 | **改用 OPENQUERY 下推 WHERE 條件** |
| 「啟用分散式交易失敗」 | MSDTC 服務未啟動/防火牆阻擋 | 啟用 MSDTC、開放 135/動態埠 |
SQL Server 透過 **ODBC → OLE DB (MSDASQL) → 連結伺服器** 橋接 MySQL,核心在於:64 位驅動 + 系統 DSN + MSDASQL 提供者 + OPENQUERY 下推查詢。將建立腳本納入版控與自動化部署,即可實現異構資料庫無縫整合。