05-03-1394، 08:03 ب.ظ
امروز دیدم یکی از دوستان مشکلی توی نمایش حروف فارسی ذخیره شده توی دیتابیس داشت که با راهنمایی که کردیم، اطلاعات جدید رو تونست به درستی ذخیره کنه ولی اطلاعات قبلی که توی دیتابیس داشت، چون یونیکد ذخیره نشده بود، همچنان بهم ریخته ظاهر میشد. گفتم بشینم یک Converter بنویسم که به راحتی دیتابیسهای غیر یونیکد رو تبدیل به یونیکد میکنه. اینم از کد:
فقط قبلش 4 تا define اول اسکریپت رو با اطلاعات دیتابیس خودتون تنظیم کنید.
روش کارش هم جالبه:
1- استخراج تمام جدولهای توی دیتابیس
2- استخراج کوئری ساخت جداول
3- جایگزینی Collation با utf-8
4- استخراج تمام اطلاعات جداول با کدگذاری قبلی
5- حذف تمام جداول
6- ساخت جداول با همون ساختار قبلی ولی با کدگذاری یونیکد
7- درج مقادیر قبلی توی جدول جدید با کدگذاری یونیکد
اگه سؤالی بود در خدمتم.
<!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- درج مقادیر قبلی توی جدول جدید با کدگذاری یونیکد
اگه سؤالی بود در خدمتم.