رتبه موضوع:
  • 0 رای - 0 میانگین
  • 1
  • 2
  • 3
  • 4
  • 5
تبدیل دیتابیس غیر Unicode به Unicode بصورت خودکار
#1
امروز دیدم یکی از دوستان مشکلی توی نمایش حروف فارسی ذخیره شده توی دیتابیس داشت که با راهنمایی که کردیم، اطلاعات جدید رو تونست به درستی ذخیره کنه ولی اطلاعات قبلی که توی دیتابیس داشت، چون یونیکد ذخیره نشده بود، همچنان بهم ریخته ظاهر میشد. گفتم بشینم یک Converter بنویسم که به راحتی دیتابیسهای غیر یونیکد رو تبدیل به یونیکد میکنه. اینم از کد:

<!doctype html>
<html>
<head>
<title>DB Conversion to UTF-8</title>
<meta charset="utf-8"/>
</head>
<body>
<?php
 
// Prevent script time-out error
set_time_limit(0);
 
define('HOST', 'localhost');    // Your MySQL host name
define('NAME', 'newbarnamenevis');      // Your database name
define('PASS', 'barnamenevis');         // Your MySQL password
define('USER', 'root');         // Your MySQL username
 
// Extract tables of a database
$tables = array();
 
// Connect to DBMS
mysql_connect(HOST, USER, PASS) or die('Connection error');
mysql_select_db(NAME) or die('Database error');
 
// Extract table names
$result = mysql_query('SHOW TABLES');
if($result && mysql_num_rows($result) > 0) {
    while($row = mysql_fetch_row($result)) {
        $tables[$row[0]] = array(
            'query'  => '',
            'values' => array(),
        );
    }
    mysql_free_result($result);
}
 
// Create each table's utf-8 create query and extract current values
foreach($tables as $name => $table) {
    $result = mysql_query('SHOW CREATE TABLE `' . $name . '`');
    if($result && mysql_num_rows($result)) {
        $row = mysql_fetch_row($result);
        $query = $row[1];
        if(preg_match('#(default charset)=([^\s]+)#i', $query)) {
            $query = preg_replace('#(default charset)=([^\s]+)#i', '$1=utf8', $query);
        }
        else {
            $query .= ' DEFAULT CHARSET=utf8';
        }
        if(preg_match('#(collate)=([^\s]+)#i', $query)) {
            $query = preg_replace('#(collate)=([^\s]+)#i', '$1=utf8_bin', $query);
        }
        else {
            $query .= ' COLLATE=utf8_bin';
        }
        $tables[$name]['query'] = $query;
        mysql_free_result($result);
    }
    $result = mysql_query('SELECT * FROM `' . $name . '`');
    if($result && mysql_num_rows($result) > 0) {
        $i = 0;
        while($row = mysql_fetch_row($result)) {
            $tables[$name]['values'][$i] = array();
            foreach($row as $item) {
                $tables[$name]['values'][$i][] = $item;
            }
            $i++;
        }
        mysql_free_result($result);
    }
}
 
// Now switch to utf-8 encoding
mysql_query('SET NAMES \'utf8\'');
 
// Drop old tables, create new utf-8 tables and store values into new tables
foreach($tables as $name => $table) {
    echo '<p>TABLE: `' . $name;
    mysql_query('DROP TABLE IF EXISTS `' . $name . '`');
    mysql_query($table['query']);
    if(count($table['values']) > 0) {
        foreach($table['values'] as $value) {
            $query = 'INSERT INTO `' . $name . '` VALUES (';
            foreach($value as $item) {
                $query .= '\'' . $item . '\',';
            }
            $query = mb_substr($query, 0, -1, 'utf-8') . ')';
            mysql_query($query);
        }
    }
    echo $name . '` DONE.</p>' . PHP_EOL;
}
?>
</body>
</html>

فقط قبلش 4 تا define اول اسکریپت رو با اطلاعات دیتابیس خودتون تنظیم کنید.

روش کارش هم جالبه:
1- استخراج تمام جدولهای توی دیتابیس
2- استخراج کوئری ساخت جداول
3- جایگزینی Collation با utf-8
4- استخراج تمام اطلاعات جداول با کدگذاری قبلی
5- حذف تمام جداول
6- ساخت جداول با همون ساختار قبلی ولی با کدگذاری یونیکد
7- درج مقادیر قبلی توی جدول جدید با کدگذاری یونیکد
اگه سؤالی بود در خدمتم.
پاسخ
تشکر شده توسط: php , راوندی , Abbas




کاربران در حال بازدید این موضوع: 1 مهمان