mysql|サーバー|データ|データベース
仕事の都合上、SQL サーバー データベースに保存されているすべてのデータを mysql データベースにインポートする必要があるため、インターネット上で関連情報を収集し、2 つの方法を見つけました。それぞれについて私の見解を説明します。
最初の方法は、mysql ODBC をインストールし、SQL サーバーのエクスポート機能を使用し、mysql データ ソースを選択してデータを直接エクスポートすることです。この方法は非常に簡単ですが、実際のアプリケーションには多くの欠点があります。データ型の問題 まず第一に、SQL サーバー データベースの ntext、image およびその他のデータ型は、mysql データベースに直接書き込むことができないと言われています。残念ながら、初心者の私はそれを少し変更するだけで済みます。第二に、私はmysqlを使用しているため、データベースの設計では時刻がint型に設定されているため(タイムスタンプが保存されます)、データがインポートされた後、再びフィールドの型が競合します。この方法で生成された MySQL データテーブルはあまり適していないため、この方法を推奨することはできないと思います。
2 番目の方法は、php または asp スクリプトを使用してデータ インポート機能を実装する方法です。この方法はプログラムを作成する必要がありますが、柔軟性が高く、操作はそれほど難しくありません。簡単に説明します。この方法の前提条件は、mysql 環境がセットアップされていることです。最初にターゲット データベースを構築し、次に SQL ステートメントを使用してすべてのテーブル構造を生成します。これで、データのみが不足しています。
次の PHP スクリプトを使用して、SQL サーバーの mydb データベースのユーザー テーブルから mysql の mydb データベースにデータをインポートできます
$cnx = odbc_connect('web', 'admin', '123456' );/ /「web」は sqlserver の mydb のデータ ソース名、「admin」は mydb にアクセスするためのユーザー名、「123456」は mydb にアクセスするためのパスワードです
$cur= odbc_exec( $cnx, 'select * from user' );// SQL サーバーで mydb データベースのユーザー テーブルを開きます
$num_row=0;
$conn=mysql_pconnect("localhost","root","123456");// mysql に接続します
@mysql_select_db ('mydb',$conn) または
die("データベースに接続できません。管理者に連絡してください!") // mysql の mydb データベースを開きます
while( odbc_fetch_row( $cur )) // データを取得しますSQL Server の mydb ライブラリ内の user テーブルから 1 つずつデータを選択したい場合は、前の select ステートメントに条件判定を追加します
{
$num_row++;
$field1 = odbc_result( $cur, 1 ); // ここでのパラメータは i(1,2,3..) であり、レコード セット内の i 番目のフィールドを参照します。fieldi は、対応するフィールドの値を取得し、fieldi を操作できます。
$field2 = odbc_result( $cur, 2 );
$field3 = odbc_result( $cur, 4 );
$field5 = odbc_result( $cur, 5 ); field6 = odbc_result( $cur, 6 );
$field5 = timetoint ($field5); //これは、SQL サーバーの datetime 型フィールドに対応する、必要な int 型への変換プロセスです
$querystring = "ユーザーに挿入
(id,name,username,password,recdate )
values('$field1','$field2','$field3','$field4','$field5')" ; $querystring,$conn);
}
関数 timetoint($ str){
$arr1=split(" ",$str);
$timestr=$arr1[1] ;
$arr_date=split("-",$datestr);
$year=$arr_date[1]; $day=$arr_date[2];
$hour=$arr_time[1];
$秒=$arr_time[2]; ,$sec,$month,$day,$year);
return $time_int;
?>
このスクリプトを sql.php として保存し、ユーザーにデータをインポートできます。サーバー上の SQL サーバーの mydb データベースのテーブルを mysql の mydb データベースに移動します。他のテーブルの操作も同様であるため、詳細は説明しません。
以下は、SQL Server の mydb データベースから mysql の mydb データベースにデータをインポートするための ASP スクリプトの紹介です
<%
set conn=server.createobject("adodb.connection")
conn.open ' web', 'admin ', '123456' // 'web' は sqlserver の mydb のデータ ソース名、'admin' は mydb にアクセスするためのユーザー名、'123456' は mydb にアクセスするためのパスワードです
set rs=server .createobject("adodb.recordset" )
sql="select ID,name,username,password,datediff(s,'1970-01-01 00:00:00',recdate)-8*3600,reid,filename, fileContentType,filevalue from senddate" // この SQL ステートメントは、datetime 型の recdate フィールドを UNIX タイムスタンプの int 型に変換します
rs.open sql,conn,1,3
set conn1=server.createobject("adodb.connection" )
conn1.open "myoa","root","q1-d6=7?"
i=1
rs.eof ではない場合に実行します
field1 = rs(0)
field2 = rs(1)
field3 = rs (2)
field4 = rs(3)
field5 = rs(4)
sql1 = "user(ID,name,username,password,recdate)に挿入
values("&field1&",'"&field2&"',' "&field3&"', '"&field4&"',"&field5&")"
conn1.execute sql1
rs.movenext
i=i+1
loop
rs.close
set rs=nothing
conn.close
set conn =何もない
conn1.close
set conn1=nothing
%>
上記の 2 つは、それぞれ php スクリプトと asp スクリプトを使用して SQL サーバーから mysql にユーザー テーブルのデータをインポートしています。 この間、私は 2 つの回避方法を使用しました。 ntext を避けてください。イメージ タイプのデータを転送するには、ntext フィールドを nvarchar(4000) に変更します。実際の状況では、元のデータのこのフィールドのデータ長は 4000 ワードを超えないため、データの切り捨ては発生しません。別の方法は、画像タイプのデータを取り出してファイルに書き込み、ファイル形式で保存し、ファイルのパスをデータベースに保存する方法です。
function makeattach(fileContentType,filevalue,i)
select case fileContentType
case "application/msword"
ext="doc"
case "application/vnd.ms-excel"
ext="exl"
case "application/vnd.ms-powerpoint"
ext="pps "
case "application/x-rar-compressed"
ext="rar"
case "application/x-zip-compressed"
ext="zip"
case "image/gif"
ext="gif "
case "image/pjpeg"
ext="jpg"
case "text/plain"
ext="txt"
case else
ext="x"
end select
if ext<>" x" then
set fso=server.createobject("FileSystemObject")
fName="attech"&i&"."&ext
Dir="d:attach"
If fso.FileExists(Dir & fName) then fso.deletefile Dir & fName
If fName<>"" AND NOT fso.FileExists(Dir & fName) then
Set strm1=Server.CreateObject("ADODB.Stream")
strm1.Open
strm1.Type=1 'Binary
strm1.Write filevalue
strm1.SaveToFile Dir & fName, 2
Set strm1=Nothing
end if
makeattach=fName
end if
end function
この関数には 3 つの入力パラメータがあり、1 つ目はファイルの contentType、2 つ目はファイルのバイナリ値、3 番目はファイル名を区別できる変数です。最初に contentType に従って保存されたファイルのサフィックス名を決定し、次に指定されたファイル名のファイルにバイナリ値を保存し、ファイルを返します。 name を出力パラメータとして指定し、返されたパラメータをデータとして mysql データベースに書き込みます。
急いでいますので、この言葉が寄り道をせずに役立つことを願っています。 :)