Chuyển latin1 sang utf8, trường hợp WordPress

Mình có một cơ sở dữ liệu WordPress với mấy nghìn bài viết nhưng từ ngày xưa lại dùng bảng mã latin1, tuy hiển thị không khó khăn gì nhưng đôi lúc cũng thật là bất tiện.

Có đôi lần mình cũng thử dùng iconv để chuyển nhưng không được. Hôm nay, nhân một ngày thu đẹp giời, mình giở thói trâu bò, quyết chuyển sang utf8 cho máu.

Đầu tiên mình dump cơ sở dữ liệu ra rồi dùng vim để tẩy, à nhầm, %s/ DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_vietnamese_ci;$/ DEFAULT CHARSET=utf8;/g.

Sau đó mình nhập dữ liệu đó vào một cơ sở dữ liệu mới có tên là blog2013 để xử lí thử.

Còn đây là cái đoạn mã vớ vẩn:

[php]
<?php

include_once (‘ezSQL-master/shared/ez_sql_core.php’);
include_once (‘ezSQL-master/mysql/ez_sql_mysql.php’);

$db = new ezSQL_mysql(‘lngt’,’123456′,’blog2013′,’localhost’);

$action = isset($_GET[‘action’]) ? $_GET[‘action’] : ”;

switch($action) {
case (‘posts’):

//BEGIN: Posts
$sql = "SELECT ID, post_title, post_content, post_excerpt FROM wp_posts";
$results = $db->get_results($sql);

foreach ($results as $r) {
$title = $db->escape($r->post_title);
$content = $db->escape($r->post_content);
$excerpt = $db->escape($r->post_excerpt);
$db->query("SET NAMES ‘utf8’");
$sql2 = "UPDATE wp_posts SET post_title=’$title’, post_content=’$content’, post_excerpt=’$excerpt’ WHERE ID=$r->ID";
$update = $db->query($sql2);
}
echo "<p>Posts: DONE! <a href=’?action=comments’>Convert comments</a></p>";
break;

case (‘comments’):

// BEGIN: Comments
$sql = "SELECT comment_ID, comment_author, comment_content FROM wp_comments";
$results = $db->get_results($sql);
foreach ($results as $r) {
$content = $db->escape($r->comment_content);
$author = $db->escape($r->comment_author);
$db->query("SET NAMES ‘utf8’");
$sql2 = "UPDATE wp_comments SET comment_author=’$author’, comment_content=’$content’ WHERE comment_ID=$r->comment_ID";
$update = $db->query($sql2);
}
echo "<p>Comments: DONE! <a href=’?action=postmeta’>Convert postmeta</a></p>";
break;

case (‘postmeta’):
// BEGIN: Postmeta
$sql = "SELECT meta_id, meta_value FROM wp_postmeta";
$results = $db->get_results($sql);

foreach ($results as $r) {
$value = $db->escape($r->meta_value);
$db->query("SET NAMES ‘utf8’");
$sql2 = "UPDATE wp_postmeta SET meta_value=’$value’ WHERE meta_id=$r->meta_id";
$update = $db->query($sql2);
}
echo "<p>Postmeta: DONE! <a href=’?action=terms’>Convert terms</a></p>";
break;

case (‘terms’):

// BEGIN: Terms
$sql = "SELECT term_id, name FROM wp_terms";
$results = $db->get_results($sql);

foreach ($results as $r) {
$name = $db->escape($r->name);
$db->query("SET NAMES ‘utf8’");
$sql2 = "UPDATE wp_terms SET name=’$name’ WHERE term_id=$r->term_id";
$update = $db->query($sql2);
}
echo "<p>Terms: DONE! <a href=’?action=taxonomy’>Convert taxonomy</a></p>";
break;

case (‘taxonomy’):

// BEGIN: Taxonomy
$sql = "SELECT term_taxonomy_id, description FROM wp_term_taxonomy";
$results = $db->get_results($sql);

foreach ($results as $r) {
$description = $db->escape($r->description);
$db->query("SET NAMES ‘utf8’");
$sql2 = "UPDATE wp_term_taxonomy SET description=’$description’ WHERE term_taxonomy_id=$r->term_taxonomy_id";
$update = $db->query($sql2);
}

echo "<p>Taxonomy: DONE! <a href=’?action=users’>Convert users</a></p>";
break;

case (‘users’):

// BEGIN: Users
$sql = "SELECT ID, display_name FROM wp_users";
$results = $db->get_results($sql);

foreach ($results as $r) {
$name = $db->escape($r->display_name);
$db->query("SET NAMES ‘utf8’");
$sql2 = "UPDATE wp_users SET display_name=’$name’ WHERE ID=$r->ID";
$update = $db->query($sql2);
}
echo "<p>Users: DONE! <a href=’?action=usermeta’>Convert usermeta</a></p>";
break;

case (‘usermeta’):

// BEGIN: Usermeta
$sql = "SELECT umeta_id, meta_value FROM wp_usermeta";
$results = $db->get_results($sql);

foreach ($results as $r) {
$value = $db->escape($r->meta_value);
$db->query("SET NAMES ‘utf8’");
$sql2 = "UPDATE wp_usermeta SET meta_value=’$value’ WHERE umeta_id=$r->umeta_id";
$update = $db->query($sql2);
}
echo "<p>Usermeta: DONE! <a href=’?action=options’>Convert options</a></p>";
break;

case (‘options’):

// BEGIN: Options
$sql = "SELECT option_id, option_value FROM wp_options";
$results = $db->get_results($sql);

foreach ($results as $r) {
$value = $db->escape($r->option_value);
$db->query("SET NAMES ‘utf8’");
$sql2 = "UPDATE wp_options SET option_value=’$value’ WHERE option_id=$r->option_id";
$update = $db->query($sql2);
}

echo "<p>ALL DONE!</p>";
break;

default:
echo "<p><a href=’?action=posts’>Begin to convert!</a></p>";
break;
}
?>
[/php]

Mình rất hâm mộ ezSQL và trên localhost lúc nào cũng có nên dùng luôn cho tiện :p

Nhân đây, các bạn cũng đã biết username và password của cơ sở dữ liệu MySQL trên máy bàn nhà mình rồi nhé.

À, kết quả thì cơ bản là tốt, chỉ có vài bài bị lỗi, không chuyển được (chưa debug nên chưa rõ lí do).