ايران ويج

نسخه‌ی کامل: تغییر Collation
شما در حال مشاهده‌ی نسخه‌ی متنی این صفحه می‌باشید. مشاهده‌ی نسخه‌ی کامل با قالب بندی مناسب.
سلام
چطور میتونم یه تیبل که Collation اش روی latin1_swedish_ci هست رو به utf8_general_ci تبدیل کنم در حالی که اطلاعات داخل تیبل هم Convert بشه به UTF8 و مشکلی با متن های فارسی نباشه؟

پیشاپیش ممنون از جوابتون
ببین با این دستور می تونی:
کد:
ALTER DATABASE <dbname> COLLATE Latin1_General_BIN
ولی توی فروم MSDN، یه نفر به مشکل برخورده، من وقت نکردم کل تاپیک رو بخونم، خودت بخون ببین چی دستگیرت می شه، اینم لینکش: http://social.msdn.microsoft.com/forums/...42eb05464/
باید اکسپرت بگیری و مطمئن بشی که اکسپرت که گرفتی درسته یعنی انکودینگش utf-8 هست
بعد با یه ادیتور ریپلیس کنی کالیشن و انکودینگ رو
کار دردسر داریه تقریبا هیچ روش دیگه ای هم نداره یا من بلد نیستم
فایل بکاپ دیتابیس بیشتر از 1 گیگ حجمش میشه
راه دیگه ای نیست؟
انکودینگ پیج های سایت utf8 هست و اطلاعات بصورت unicode ذخیره شده
نمیشه مستقیم collection رو utf8_general_ci کرد؟
کد:
ALTER DATABASE <dbname> COLLATE utf8_general_ci

اینو تست کردم همش علامت سوال شد اینجوری: ؟؟؟ ؟؟؟؟؟؟ ؟؟؟ ؟؟؟؟؟؟ ؟؟؟؟؟
تقریبا راه دیگه ای نیست
به همون شکل علامت سوال در می یاد یه راه دیگه هم هست تک تک فیلد ها رو به باینری تبدیل کنی بعد به string با انکودینگ درست
که اینم کار سختیه
چند تا سؤال:
1. شما چرا می خوای Collation رو عوض کنی؟
2. این کار فقط باید یک بار انجام بشه؟
3. چند تا Table داری و حدوداً هر کدوم چند تا Field دارن؟
نقل قول: یه راه دیگه هم هست تک تک فیلد ها رو به باینری تبدیل کنی بعد به string با انکودینگ درست
که اینم کار سختیه
اینو بیشتر توضیح میدی؟
-----------------------------------------------------------------
far_222000:

1- برای اینکه بعضی کاراکتر های یونیکد در دیتابیس خراب میشن
دوما اگه بخوام اطلاعات رو با برنامه ای مثل phpmyadmin ویرایش کنم چون utf8 داخل latin1_swedish هست قابل خوندن نیست و اینجوری توی phpmyadmin نشون داده میشه: میزبانی وب Ùˆ Ø
بعد از ویرایش هم تیبل ها همشون به هم میریزه و اطلاعات علامت سوال میشن

2- بله.
بعضی از تیبل های اولیه توسط یه برنامه نویس دیگه درست شده بودن که حالا رفته
و مسئولیت کل دیتابیس به عهده منه و نیاز هست به حالت استاندارد برشون گردونم.

3- 20 تا تیبل ، هر کدوم تعداد متفاوتی بین 5 تا 18 تا فیلد دارن
و در دیتابیس چندین هزار رکورد وجود داره.
راستی بعضی از تیبل ها هم دارای collection درست (utf8_general_ci) هستن
اما بعضی ها که میخوام درست بشن latin_swedish هستن
و اینو هم مجدد بگم که اطلاعات تمام تیبل ها (هر دو نوع بالا) با انکودینگ utf8 ذخیره شدن

الان یه فکری به سرم زد....
نمیشه مثلا با یه اسکریپت PHP اطلاعات رو بخونیم و تو یه تیبل دیگه بریزیم؟
یه اسکریپتی مثل bigdump
اينجا رو ببين
کد php:
<?php
 
// this script will output the queries need to change all fields/tables to a different collation
// it is HIGHLY suggested you take a MySQL dump prior to running any of the generated
// this code is provided as is and without any warranty
 
die("Make a backup of your MySQL database then remove this line");
 
set_time_limit(0);
 
// collation you want to change:
$convert_from 'latin1_swedish_ci';
 
// collation you want to change it to:
$convert_to   'utf8_general_ci';
 
// character set of new collation:
$character_set'utf8';
 
$show_alter_table true;
$show_alter_field true;
 
// DB login information
$username 'user';
$password 'pass';
$database 'table';
$host     'localhost';
 
mysql_connect($host$username$password);
mysql_select_db($database);
 
$rs_tables mysql_query(" SHOW TABLES ") or die(mysql_error());
 
print 
'<pre>';
while (
$row_tables mysql_fetch_row($rs_tables)) {
    
$table mysql_real_escape_string($row_tables[0]);
    
    
// Alter table collation
    // ALTER TABLE `account` DEFAULT CHARACTER SET utf8
    
if ($show_alter_table) {
        echo(
"ALTER TABLE `$table` DEFAULT CHARACTER SET $character_set;\r\n");
    }
 
    
$rs mysql_query(" SHOW FULL FIELDS FROM `$table` ") or die(mysql_error());
    while (
$row=mysql_fetch_assoc($rs)) {
        
        if (
$row['Collation']!=$convert_from)
            continue;
 
        
// Is the field allowed to be null?
        
if ($row['Null']=='YES') {
            
$nullable ' NULL ';
        } else {
            
$nullable ' NOT NULL';
        }
 
        
// Does the field default to null, a string, or nothing?
        
if ($row['Default']==NULL) {
            
$default " DEFAULT NULL";
        } else if (
$row['Default']!='') {
            
$default " DEFAULT '".mysql_real_escape_string($row['Default'])."'";
        } else {
            
$default '';
        }
 
        
// Alter field collation:
        // ALTER TABLE `account` CHANGE `email` `email` VARCHAR( 50 ) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL
        
if ($show_alter_field) {
            
$field mysql_real_escape_string($row['Field']);
            echo 
"ALTER TABLE `$table` CHANGE `$field` `$field$row[Type] CHARACTER SET $character_set COLLATE $convert_to $nullable $default; \r\n";
        }
    }
}
 
?>
منبع هم اينجاست
http://www.phpwact.org/php/i18n/utf-8/mysql
اونی که گفتم تایپ هر فیلدی که استرینگ هست رو بکن باینری دوباره برش گردون به استرینگ تو قسمت استراکچر تیبل
روش استفاده از یه کد php هم شدنیه