تغییر Collationهای یک دیتابیس

شنبه, اردیبهشت ۲۶م, ۱۳۸۸ | طراحی وب

می‌خواستم برای کمک به دوست تازه ام سینا ارزانی، اطلاعات انجمن قبلی سریال لاست را به انجمن جدید آن منتقل کنم که با مشکل اشتباه در Collation انجمن قبلی مواجه شدم. Collation مربوط به دیتابیس، جداول و فیلدها در انجمن قبلی فارسی نبود و بنابراین اطلاعات هم با فرمت نادرست در آن ذخیره شده بود.

این مشکلی است که خیلی از دیتابیس های Mysql در حال حاضر دارند و Collation اغلب آنها هم بصورت latin1_swedish_ci تنظیم شده است و اصولا یونیکد نیستند. برای تبدیل Collation برنامه ای نوشتم که فقط کافی است نام دیتابیس را به آن بدهید و سپس تمام جداول و فیلدهای آن را به Collation مورد نظر شما تبدیل می‌کند. Collation درست برای زبان فارسی utf8_persian_ci است و بهتر است Collation تمام قسمتهای دیتابیس شما بر روی این تنظیم باشد. نکته جالب در مورد این برنامه این است که بعد از تصحیح Collation، فرمت اطلاعات شما هم درست می‌شود. اما اگر بر حسب اتفاق چنین اتفاقی برای شما نیفتاد باید بعد اصلاح Collationها یک برنامه بنویسید که با Charset مربوط به دیتابیس قبلی به آن متصل شوید و اطلاعات را بخوانید و بعد با Charset مربوط به دیتابیس جدید به دیتابیس جدید (که رکوردی در آن ندارد) وصل شوید و اطلاعات را درون آن بریزید. البته همانطور که گفتم نیازی به این مورد نیست و خود این برنامه با کمال تعجب این کار دومی را هم انجام می‌دهد!

نکته دیگراینکه اگر نمی‌خواهید Collation همه جداول و فیلدها با این برنامه اصلاح شوند می‌توانید جداول مورد نظر خود را در یک دیتابیس جدا بریزید و نام دیتابیس جدید را به این برنامه بدهید. نکته آخر هم اینکه قبل از انجام هرکاری از اطلاعات خود نسخه پشتیبان تهیه کنید که هیچگونه مسئولیتی در قبال از دست رفتن احتمالی اطلاعات شما نخواهم پذیرفت!

پی نوشت: خیلی وقتها علت اینکه اینجا مطلب تخصصی می‌نویسم این است که خودم درآینده به آن نیاز پیدا می‌کنم!

<?php
function MysqlError()
{
if (
mysql_errno())
{
echo 
“<b>Mysql Error: ” mysql_error() . “</b>\n”;
}
}
$username “root”;
$password “”;
$db “”;
$host “localhost”;
$target_charset “utf8″;
$target_collate “utf8_persian_ci”;
echo 
“<pre>”;
$conn mysql_connect($host$username$password);
mysql_select_db($db$conn);
$tabs = array();
$res mysql_query(“SHOW TABLES”);
MysqlError();
while ((
$row mysql_fetch_row($res)) != null)
{
$tabs[] = $row[0];
}
// now, fix tables
foreach ($tabs as $tab)
{
$res mysql_query(“show index from {$tab}”);
MysqlError();
$indicies = array();
while ((
$row mysql_fetch_array($res)) != null)
{
if (
$row[2] != “PRIMARY”)
{
$indicies[] = array(“name” => $row[2], “unique” => !($row[1] == “۱″), “col” => $row[4]);
mysql_query(“ALTER TABLE {$tab} DROP INDEX {$row[2]}”);
MysqlError();
echo 
“Dropped index {$row[2]}. Unique: {$row[1]}\n”;
}
}
$res mysql_query(“DESCRIBE {$tab}”);
MysqlError();
while ((
$row mysql_fetch_array($res)) != null)
{
$name $row[0];
$type $row[1];
$set false;
if (
preg_match(“/^varchar\((\d+)\)$/i”$type$mat))
{
$size $mat[1];
mysql_query(“ALTER TABLE {$tab} MODIFY {$name} VARBINARY({$size})”);
MysqlError();
mysql_query(“ALTER TABLE {$tab} MODIFY {$name} VARCHAR({$size}) CHARACTER SET {$target_charset} COLLATE {$target_collate}”);
MysqlError();
$set true;
echo 
“Altered field {$name} on {$tab} from type {$type}\n”;
}
else if (!
strcasecmp($type“CHAR”))
{
mysql_query(“ALTER TABLE {$tab} MODIFY {$name} BINARY(1)”);
MysqlError();
mysql_query(“ALTER TABLE {$tab} MODIFY {$name} VARCHAR(1) CHARACTER SET {$target_charset} COLLATE {$target_collate}”);
MysqlError();
$set true;
echo 
“Altered field {$name} on {$tab} from type {$type}\n”;
}
else if (!
strcasecmp($type“TINYTEXT”))
{
mysql_query(“ALTER TABLE {$tab} MODIFY {$name} TINYBLOB”);
MysqlError();
mysql_query(“ALTER TABLE {$tab} MODIFY {$name} TINYTEXT CHARACTER SET {$target_charset} COLLATE {$target_collate}”);
MysqlError();
$set true;
echo 
“Altered field {$name} on {$tab} from type {$type}\n”;
}
else if (!
strcasecmp($type“MEDIUMTEXT”))
{
mysql_query(“ALTER TABLE {$tab} MODIFY {$name} MEDIUMBLOB”);
MysqlError();
mysql_query(“ALTER TABLE {$tab} MODIFY {$name} MEDIUMTEXT CHARACTER SET {$target_charset} COLLATE {$target_collate}”);
MysqlError();
$set true;
echo 
“Altered field {$name} on {$tab} from type {$type}\n”;
}
else if (!
strcasecmp($type“LONGTEXT”))
{
mysql_query(“ALTER TABLE {$tab} MODIFY {$name} LONGBLOB”);
MysqlError();
mysql_query(“ALTER TABLE {$tab} MODIFY {$name} LONGTEXT CHARACTER SET {$target_charset} COLLATE {$target_collate}”);
MysqlError();
$set true;
echo 
“Altered field {$name} on {$tab} from type {$type}\n”;
}
else if (!
strcasecmp($type“TEXT”))
{
mysql_query(“ALTER TABLE {$tab} MODIFY {$name} BLOB”);
MysqlError();
mysql_query(“ALTER TABLE {$tab} MODIFY {$name} TEXT CHARACTER SET {$target_charset} COLLATE {$target_collate}”);
MysqlError();
$set true;
echo 
“Altered field {$name} on {$tab} from type {$type}\n”;
}
if (
$set)
mysql_query(“ALTER TABLE {$tab} MODIFY {$name} COLLATE {$target_collate}”);
}
// re-build indicies..
foreach ($indicies as $index)
{
if (
$index["unique"])
{
mysql_query(“CREATE UNIQUE INDEX {$index["name"]} ON {$tab} ({$index["col"]})”);
MysqlError();
}
else
{
mysql_query(“CREATE INDEX {$index["name"]} ON {$tab} ({$index["col"]})”);
MysqlError();
}
echo 
“Created index {$index["name"]} on {$tab}. Unique: {$index["unique"]}\n”;
}
// set default collate
mysql_query(“ALTER TABLE {$tab} DEFAULT CHARACTER SET {$target_charset} COLLATE {$target_collate}”);
}
// set database charset
mysql_query(“ALTER DATABASE {$db} DEFAULT CHARACTER SET {$target_charset} COLLATE {$target_collate}”);
mysql_close($conn);
echo 
“</pre>”;
?>

۴ نظر برای تغییر Collationهای یک دیتابیس

سینا ارزانی
اردیبهشت ۲۶, ۱۳۸۸

واقعا جا داره اینجا ازتون تشکر کنم. خیلی کمک کردید.
دقیقا بلاگ من هم جایی است برای آرشیو کارهایی که احتمال میدهم در آینده به کارم بیاید. بازهم از زحمات شما سپاسگذارم

جعفر بخشی بی نیاز
اردیبهشت ۲۶, ۱۳۸۸

علی جان : سلام و درود …
خیلی تمایل دارم شما دوست عزیز رو از نزدیک زیارت کنم . اگه قابل بدونید اداره کل زندانها در خیایبان نوروزیان و یا بیرون از اداره . شما دستور بفرمائید من خدمت می رسم .
فدای شما : ارادتمند : زندانک

احسان رمضانی
شهریور ۱۶, ۱۳۸۸

من مای بی بی خودم رو توی سیستم وبی لاین انجام میدم همه چیز درسته همه کارهایی که گفته شد در سایت آقای ارزانی انجام شد اما باز هم مشکلات ؟ هنوز دامن گیر من هستش میخواستم اگه میشه کمکم کنید واقعا خیلی نیاز دارم به کسی که بتونه مشکلم رو حل کنه این آیدی یاهو منه فقط ترو خدا کمک کنید : kingrap.team من آنلاینم منتظر شما هستم ممنونم

دیدگاه شما

جستجو