Windows1251からUTF8への基本変換

みなさんこんにちは。 ベースをCP1251からUTF8に変換する問題に直面しました。

インターネットに登っても、既製のスクリプトは見つかりませんでした(明らかに見た目が悪い)。

そこで、自分でスクリプトを書くことにしました。 変換はベースダンプなしで行われます。 シンボルe = eなどの問題を解決しました。



カットの下で継続



健康に使用してください。

スクリプトの先頭にある開始タグを修正します。 Habrはそれを削減し、質問を選別する必要がありました;)



UPD:

労働者の要請で、仕事のアルゴリズムを説明します。

1.テーブルの名前をtemporaryに変更します。

2.テーブルの説明を取得します。 その中で、デフォルトの文字セットをutf8に変更します。 照合utf8_binを配置します(文字が通常トランスコードされるように行われます。e= eなどの問題はありませんでした。しかし、1つの問題があります。文字列値を比較する場合、大文字と小文字は区別されます)。

3.キーの使用を無効にします(挿入速度を上げます)。 ALTER TABLE table_in_utf8 DISABLE KEYS;

4. cp1251にあるテーブルのデータを、utf8エンコーディングでテーブルに挿入します。 INSERT INTO table_in_utf8 SELECT * FROM table_in_cp1251;

5. ALTER TABLEキーtable_in_utf8 ENABLE KEYSの使用をオンにします。



プロジェクトに多くのテーブルがある場合、スクリプトはこれらすべてをペンで行わないように書かれています。



コンソールの `php -f export.php`またはWebからスクリプトを実行できます。





<\?php



$ time = microtime(true);



$ db = 'vspomni';

$ login = 'vspomni';

$ passw = '';

$ host = 'vspomni.ru';



$ res = mysql_connect($ホスト、$ログイン、$ passw);

mysql_select_db($ db);



mysql_query( 'SET NAMES utf8;');



$ rs = mysql_query( 'SHOW TABLES;');

print mysql_error(); //悪名高い「同期外れコマンド」メッセージ:(

while(($ row = mysql_fetch_assoc($ rs))!== false){



$ time1 =マイクロタイム(true);

// $ row ['Tables_in_vspomni2']を出力します。「\ n」;

$ table_name = $ row ['Tables_in _'。$ db];

$ query = 'SHOW CREATE TABLE'。$ table_name;



$ row_create = mysql_query($ query);

print mysql_error();

$ row1 = mysql_fetch_assoc($ row_create);



if(strpos($ row1 ['Create Table']、 'DEFAULT CHARSET = utf8')!== false)

{

'Table'を印刷します。$ table_name。 ' -'。 "\ N"をスキップしました。

続ける;

}



$ create_table_scheme = str_ireplace( 'cp1251'、 'utf8'、$ row1 ['Create Table']); //テーブルスキームの作成

$ create_table_scheme = str_ireplace( 'ENGINE = InnoDB'、 'MyISAM'、$ create_table_scheme);

$ create_table_scheme。= 'COLLATE utf8_bin';



// print $ create_table_scheme;

//続行;



$ query = 'RENAME TABLE'。$ table_name。 ' TO '。$ Table_name .'_ tmp_export'; // RENAME TABLE;

mysql_query($クエリ);

$ error = mysql_error();

if(strlen($ error)> 0)

{

$エラーを出力します。 -LINE '.__ LINE __。 "\ N";

休憩;

}



$ query = $ create_table_scheme;

mysql_query($クエリ);

$ error = mysql_error();

if(strlen($ error)> 0)

{

$エラーを出力します。 -LINE '.__ LINE __。 "\ N";

休憩;

}



$ query = 'ALTER TABLE'。$ table_name。 ' キーを無効にする ';

mysql_query($クエリ);

$ error = mysql_error();

if(strlen($ error)> 0)

{

$エラーを出力します。 -LINE '.__ LINE __。 "\ N";

休憩;

}



$ query = 'INSERT INTO'。$ table_name。 ' SELECT * FROM '。$ Table_name .'_ tmp_export';

mysql_query($クエリ);

$ error = mysql_error();

if(strlen($ error)> 0)

{

$エラーを出力します。 -LINE '.__ LINE __。 "\ N";

休憩;

}



$ query = 'DROP TABLE'。$ table_name .'_ tmp_export ';

mysql_query($クエリ);

$ error = mysql_error();

if(strlen($ error)> 0)

{

$エラーを出力します。 -LINE '.__ LINE __。 "\ N";

休憩;

}



$ time3 =マイクロタイム(true);

$ query = 'ALTER TABLE'。$ table_name。 ' キーを有効にする ';

mysql_query($クエリ);

$ error = mysql_error();

if(strlen($ error)> 0)

{

$エラーを出力します。 -LINE '.__ LINE __。 "\ N";

休憩;

}



「キーを有効にする」を印刷します。 time-'。(microtime(true)-$ time3)。 "\ n";

print 'converted'。$ table_name。 '。 time-'。(microtime(true)-$ time1)。 "\ n \ n";



}

mysql_free_result($ rs);



「完了」を印刷します。 合計時間-'。(マイクロタイム(true)-$時間);

?>





PS今夜、17分でこのスクリプトによって変換されたこのプロジェクトのプロジェクトデータベースを思い出しました。



オリジナルはこちらhttp://suhanovo.livejournal.com/4560.html



All Articles