首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

SQL Server 遷移 MySQL:datetime 型別轉換避坑指南

     編輯:MySQL 資料庫相關知識

問題現象

使用 PHP mssql 擴充套件讀取 SQL Server datetime 欄位,直接 SELECT 取得的值無法直接寫入 MySQL,會報錯或資料錯亂。

根本原因

  • SQL Server datetime 精度 3.33ms,格式含毫秒(如 2024-03-12 14:30:45.123)。
  • PHP mssql 驅動回傳格式可能不被 MySQL 原生 DATETIME 解析。
  • MySQL DATETIME 精度為秒(5.6.4+ 支援微秒),格式嚴格 YYYY-MM-DD HH:MM:SS。

解決方案:SQL Server 端轉 VARCHAR 再入 MySQL

SELECT CONVERT(VARCHAR, datetime欄位, 120) FROM 來源表;
-- 120 = ODBC 標準格式 'YYYY-MM-DD HH:MI:SS(24h)'

範例:

CONVERT(VARCHAR, create_time, 120)  -- 產出 '2024-03-12 14:30:45'

完整遷移流程

  1. SQL Server 查詢:SELECT id, CONVERT(VARCHAR, create_time, 120) AS create_time, ... FROM src_table
  2. PHP 取得字串陣列。
  3. MySQL 插入:INSERT INTO dst_table (id, create_time, ...) VALUES (?, ?, ...),參數綁定字串,MySQL 自動轉型。

常用 CONVERT 風格代碼速查

代碼格式範例說明
1202024-03-12 14:30:45ODBC 標準,推薦
1212024-03-12 14:30:45.123含毫秒
11220240312純日期
10814:30:45純時間

進階:大量遷移用 BCP / SSIS

  • bcp "SELECT ... FROM db.dbo.tbl" queryout data.txt -c -t, -S server -U user -P pwd 導出 CSV。
  • MySQL LOAD DATA INFILE 或 mysqlimport 高速導入。
  • SSIS 封裝可視化拖拉,支援資料轉換、錯誤導向、增量捕捉。

驗證腳本

-- 抽樣比對
SELECT COUNT(*) FROM mysql_tbl;
SELECT COUNT(*) FROM sqlserver_tbl;

-- 隨機抽樣 10 筆比對時間欄位
SELECT create_time FROM mysql_tbl ORDER BY RAND() LIMIT 10;
SELECT CONVERT(VARCHAR, create_time, 120) FROM sqlserver_tbl ORDER BY NEWID() LIMIT 10;
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved