一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

Mysql|Sql Server|Oracle|Redis|MongoDB|PostgreSQL|Sqlite|DB2|mariadb|Access|數(shù)據(jù)庫(kù)技術(shù)|

服務(wù)器之家 - 數(shù)據(jù)庫(kù) - Mysql - 找到一種不錯(cuò)的從SQLServer轉(zhuǎn)成Mysql數(shù)據(jù)庫(kù)的方法

找到一種不錯(cuò)的從SQLServer轉(zhuǎn)成Mysql數(shù)據(jù)庫(kù)的方法

2019-10-18 16:25mysql技術(shù)網(wǎng) Mysql

年初的時(shí)候一直在做一個(gè)網(wǎng)站MSSQL2000-MySQL5的遷移工作,因?yàn)椴捎昧瞬煌某绦蛳到y(tǒng),所以主要問(wèn)題在數(shù)據(jù)的遷移。由于2個(gè)系統(tǒng) 數(shù)據(jù)庫(kù) 結(jié)構(gòu)差異非常大,不方便采取SQLSERVER里導(dǎo)入MYSQL的ODBC數(shù)據(jù)源的功能(也不推薦這么做,字段類型

年初的時(shí)候一直在做一個(gè)網(wǎng)站MSSQL2000 -> MySQL5的遷移工作,因?yàn)椴捎昧瞬煌某绦蛳到y(tǒng),所以主要問(wèn)題在數(shù)據(jù)的遷移。由于2個(gè)系統(tǒng)數(shù)據(jù)庫(kù)結(jié)構(gòu)差異非常大,不方便采取SQL SERVER里導(dǎo)入MYSQL的ODBC數(shù)據(jù)源的功能(也不推薦這么做,字段類型等不同點(diǎn)會(huì)搞死人的~),因此就在WINDOWS下自己寫PHP腳本從SQLSERVER里讀數(shù)據(jù),然后按照新系統(tǒng)的需要處理之后插入MYSQL里面,靈活也比較方便。實(shí)際過(guò)程主要有下面幾個(gè)問(wèn)題: 

1、數(shù)據(jù)庫(kù)的連接,主要是連接SQL SERVER。主要有3種方法: 
1.1 利用PHP中的mssql_系列函數(shù),這個(gè)與使用mysql_系列函數(shù)類似,不過(guò)要打開(kāi)php.ini中相關(guān)擴(kuò)展(extension=php_mssql.dll)。 
1.2 利用ODBC連接,由于抽象了具體數(shù)據(jù)庫(kù),所以沒(méi)有辦法利用數(shù)據(jù)表字段名=>數(shù)組鍵名的特性,在針對(duì)具體應(yīng)用時(shí)不是很方便,代碼形式: 

$conn = odbc_connect("datasource","username","password"); 
$sql = "select * from news"; 
$cur= odbc_exec($conn, $sql); 
while(odbc_fetch_row($cur)){ 
    $field1 = odbc_result($cur,1); 
    $field2 = odbc_result($cur,2); 
//do something 

1.3 使用PDO - PHP5中加入數(shù)據(jù)對(duì)象抽象層,作為官方推出的數(shù)據(jù)訪問(wèn)接口,優(yōu)點(diǎn)有很多,比如支持參數(shù)綁定以防止SQL注入;對(duì)于不同數(shù)據(jù)庫(kù)加載不同驅(qū)動(dòng)即可,程序代碼是一致的,便于移植等等,相信應(yīng)該是大勢(shì)所趨。不過(guò)由于用了PHP5全新的面向?qū)ο筇匦裕枰狿HP5的支持,5.1可以直接使用,5需要裝PECL,另外還要修改PHP.ini,增加:extension=php_pdo_mysql.dll和extension=php_pdo_mssql.dll,實(shí)際代碼如下: 

try { 
    $DBH=new PDO("mssql:dbname=XXX;host=localhost",  
"root", "password");//Connect to DB 
} catch (PDOException $e) { 
    print "Error!: " . $e->getMessage();//Error Message 
    die(); 

$stmt = $DBH->prepare("SELECT * FROM news");//Stmt Handle $stmt 
if ($stmt->execute()) { 
    while ($row = $stmt->fetch()) { 
        //do something 
    } 

$stmt2 = $mssql->prepare("INSERT INTO news  
(title,author) VALUES (:title, :author)"); 
$stmt2->bindParam(':title', $title); 
$stmt2->bindParam(':author', $author); 
$stmt2->execute(); 
$DBH = null;// Close Connection這里要提醒下的是MSSQL里面是沒(méi)有MYSQL中LIMIT這個(gè)語(yǔ)法的。 

2、TEXT字段被截?cái)嗟膯?wèn)題。 
上面嘗試了3種連接數(shù)據(jù)庫(kù)方法,是因?yàn)楫?dāng)初連上MSSQL后SELECT出來(lái)的數(shù)據(jù)總是只有4K長(zhǎng)度,以為是連接方式限制導(dǎo)致的,所以換了幾種都是這樣,最后查了資料才知道,是php.ini里面這2句配置的問(wèn)題: 
; Valid range 0 - 2147483647. Default = 4096. 
mssql.textlimit = 4096 

; Valid range 0 - 2147483647. Default = 4096. 
mssql.textsize = 4096 
把4096改成-1(代表無(wú)限制)即可,也可以使用mssql_query("SET TEXTSIZE 65536");來(lái)實(shí)現(xiàn)。 

3.兩種數(shù)據(jù)庫(kù)字段類型不同的問(wèn)題有2個(gè)地方需要講一下,一個(gè)是字段支持最大長(zhǎng)度要注意,以免插入數(shù)據(jù)庫(kù)時(shí)候被截?cái)啵硗庖粋€(gè)就是日期格式的問(wèn)題了,我比較喜歡用UNIX時(shí)間戳。在連MSSQL時(shí)候可以用 "select unix_timestamp(created) from news" 來(lái)實(shí)現(xiàn)MSSQL里面DATETIME到MYSQL里時(shí)間戳的轉(zhuǎn)換。不過(guò)遷移時(shí)候一次要提取表中所有字段,像上面這種方法就沒(méi)有簡(jiǎn)單的"select * from news"簡(jiǎn)潔,需要羅列所有字段。實(shí)際可以直接SELECT出來(lái),得到的是一個(gè)字符串,比如在MSSQL里面是2006-01-01 12:01,取出來(lái)的字符串是"2006 一月 01 12:01"(有些奇怪,不知道為什么會(huì)產(chǎn)生中文)。用下面這個(gè)函數(shù)可以轉(zhuǎn)換成時(shí)間戳: 

function ConvertTime($timestring){ 
    if($timestring == null){ 
        return  0; 
    } 
    $time = explode(" ",$timestring); 
    $year = $time[0]; 
    switch ($time[1]){ 
        case "一月":$month = "1";break; 
        case "二月":$month = "2";break; 
        case "三月":$month = "3";break; 
        case "四月":$month = "4";break; 
        case "五月":$month = "5";break; 
        case "六月":$month = "6";break; 
        case "七月":$month = "7";break; 
        case "八月":$month = "8";break; 
        case "九月":$month = "9";break; 
        case "十月":$month = "10";break; 
        case "十一月":$month = "11";break; 
        case "十二月":$month = "12";break; 
        default:break; 
    } 
    $day = $time[2]; 
    $h = 0; 
    $m = 0; 
    $s = 0; 
    if(!empty($time[3])){ 
        $time2 = explode(":",$time[3]); 
        $h = $time2[0]; 
        $i = $time2[1]; 
    } 
    //return date("Y-m-d H:i:s",mktime($h,$i,$s,$month,$day,$year)); 
    return mktime($h,$i,$s,$month,$day,$year); 
}最后轉(zhuǎn)換腳本寫完了可以在CMD窗口里面用php.exe abc.php來(lái)執(zhí)行,這種方式是沒(méi)有超時(shí)時(shí)間的,適合遷移大批量數(shù)據(jù)。 
基本上就是這些內(nèi)容,希望對(duì)大家有幫助。  

Update(06/05/05):關(guān)于時(shí)間戳的轉(zhuǎn)換,在php.ini中加上 
mssql.datetimeconvert = Off 
后就能得到類似2006-01-01 12:01不帶有中文的格式了。

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 暖暖免费观看高清在线 | 色偷偷影院 | 四虎精品免费国产成人 | 无码AV精品一区二区三区 | 超级乱淫伦小说1女多男 | 国产一区在线免费观看 | 男人j进女屁股视频在线观看 | 天堂成人在线观看 | 插鸡小说 | 亚洲AV无码国产精品色午夜情 | 91热国内精品永久免费观看 | 国产自产2023最新麻豆 | 99久久精品国语对白 | 欧美在线视频免费播放 | 美女女女女女女bbbbbb毛片 | 久久国产36精品色熟妇 | 精品91| 成全视频在线观看免费 | 久久国产伦子伦精品 | 手机在线观看伦理片 | 色婷婷综合久久久 | 美女gif跪趴式抽搐动态图 | 奇米影视7777久久精品 | 亚洲午夜精品久久久久 | 亚洲国产三级在线观看 | 好看的亚洲视频 | 欧美日韩一区不卡 | 国产精品久久久久久搜索 | 视频一区二区 村上凉子 | 亚洲羞羞裸色私人影院 | h在线动漫 | 国产精品国产色综合色 | 1717国产精品视频免费 | 亚洲国产精品嫩草影院永久 | 国产日韩欧美在线一二三四 | 久久久久久久国产精品视频 | 爽好舒服把腿张小说 | 免费毛片在线观看 | 母乳在线| 亚洲色图影院 | 国产一久久香蕉国产线看观看 |