PDA

View Full Version : سوال: تبديل ديتا بيس 1256 به utf-8



imanitc
دوشنبه 29 مهر 1392, 11:57 صبح
سلام دوستان يه سري اطلاعات توي يه ديتا بيس با انکدينگ 1256 ذخيره شده دارم ميخاستم اطلاعات اونو تبديل کنم به فرمت utf-8 کد اسکيوال يا php براي اين کار هست؟راهنمايي کنيد ممنون

masiha68
دوشنبه 29 مهر 1392, 18:46 عصر
حتما هست
قبلا اقای شهرکی زحمتش رو کشیدن :)
اینجا رو ببینید.
http://barnamenevis.org/showthread.php?215150-snippet-%D9%87%D8%A7%DB%8C-php&p=1690765&viewfull=1#post1690765

imanitc
سه شنبه 30 مهر 1392, 21:25 عصر
دوست عزیز این کد استفاده کردم متاسفانه کلیه دیتا ها رو تبدیل به چیزای نا مربوط کرد نوع داده ریخت بجای کانتنهام.حجم دیتا بیس حدود 400 مگ و حدود 2000 تا رکورد داره

masiha68
سه شنبه 30 مهر 1392, 21:49 عصر
شرمنده من از این کد استفاده نکردم ... بهتره اگه سوالی دارین به همون بخش برین و از خود اقای شهرکی بپرسین

imanitc
جمعه 03 آبان 1392, 09:12 صبح
دوستان کسی میتونه این دیتا بیس تبدیل کنه نمونه کد اسکیو ال هم اینه

112200

rahnema1
جمعه 03 آبان 1392, 11:30 صبح
داخل این فایل sql کاراکترها با فرمت 1252 بودند که بعدا تبدیل به utf شدند که استفاده از این فایلی که شما گذاشتید فکر کنم مساله رو پیچیده تر کنه اما دو تا لینک زیر رو ببینید مخصوصا دومی:
http://docs.moodle.org/23/en/Converting_your_MySQL_database_to_UTF8

http://stackoverflow.com/questions/6115612/how-to-convert-an-entire-mysql-database-characterset-and-collation-to-utf-8

MMSHFE
جمعه 03 آبان 1392, 13:52 عصر
اسکریپت رو برای شما یکم تغییر دادم منتها باید قبل از اجرا، به نکات زیر دقت کنید:
1- Collation دیتابیس، جداول و فیلدها رو به latin1_swedish_ci برگردونید (چون داده ها یونیکد نیست و کدگذاری رو یونیکد گذاشتین، تبدیل به درستی انجام نمیشه.
2- اسکریپت رو اجرا کنید.
3- کوئریهایی که به شما داده میشه (با حروف معمولی نوشته شده و توپر نیست) رو کپی کنید و توی phpMyAdmin در قسمت SQL اجرا کنید (باید داخل دیتابیس شده باشین).
4- اگه برای Drop از شما سؤال پرسید، OK رو بزنید.
اینهم از اسکریپت مخصوص دیتابیس شما:


<!doctype html>
<html>
<head>
<title>DB Conversion to UTF-8</title>
<meta charset="windows-1256" />
</head>
<body>
<?php

// Prevent script time-out error
set_time_limit(0);

define('HOST', 'localhost'); // Your MySQL host name
define('NAME', '#mysql50#al-shia_content'); // Your database name
define('PASS', 'ncis'); // 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');
mysql_query('SET NAMES \'latin1\'');

// 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_close();
mysql_connect(HOST, USER, PASS) or die('Connection error');
mysql_select_db(NAME) or die('Database error');
mysql_query('SET NAMES \'utf8\'');

// Drop old tables, create new utf-8 tables and store values into new tables
foreach($tables as $name => $table) {
$queries = '';
echo '<p><strong>TABLE: `' . $name . '`</strong></p>' . PHP_EOL;
$queries .= 'DROP TABLE IF EXISTS `' . $name . '`;<br />' . PHP_EOL;
$queries .= $table['query'] . ';<br />' . PHP_EOL;
if(count($table['values']) > 0) {
foreach($table['values'] as $value) {
$query = 'INSERT INTO `' . $name . '` VALUES (';
foreach($value as $item) {
$query .= '\'' . $item . '\',';
}
$query = substr($query, 0, -1) . ');';
$queries .= $query . '<br />' . PHP_EOL;
}
}
$queries .= '<hr />' . PHP_EOL;
}
echo ($queries);
?>
</body>
</html>

imanitc
جمعه 03 آبان 1392, 15:30 عصر
مهندس ممنون کد درست شده فقط مشکل سر یه فیلد که فکر میکنم فرمت اون یه چیز دیگس چون باز هم دیتا هاش نا مفهوم فایل میذارم جسارتا اگر فرصت کردید یه نگاهی بهش بندازین ممنون از لطفتون.
این فایل شامل 150 تا رکورد از همان تیبل ولی فقط فیلد title درست میشه و فیلد content بازم عجق وجق میشه :متفکر:

112216

MMSHFE
جمعه 03 آبان 1392, 18:06 عصر
تا جایی که بررسی کردم محتوای فیلد content شما مشخص نیست از چه کدگذاری استفاده کرده و متأسفانه تمام حالتهایی که امتحان کردم با مشکل مواجه شدن. توی سایتتون درست نشون میده؟ اگه درست نشون میده لطفاً کدی که از دیتابیس میخونید و نشون میدین رو برام بگذارین تا تبدیلش رو بنویسم.

imanitc
شنبه 04 آبان 1392, 08:21 صبح
مهندس لطف کردي.اين ديتابيس براي سايت قبليشون الان ديگه استفاده نميشه فقط ميخان ديتا هاشون بريزيم توي اين سايت جديدشون. حدس ميزنم خودشون يه دستکاريهايي کردن.اگر تونستم چيز جديدي بفهمم حتما مزاحم ميشم لطف کرديد ممنون

rahnema1
شنبه 04 آبان 1392, 09:23 صبح
دوست عزیز همون طور که قبلا گفتم کدپیج عجق وجق ها 1252 هست بعدش اومدید فایلی که کاراکترهاش 1252 هست رو باز تبدیل به utf8 کردید
دقت کن 1252 نه 1256
بعدش ببین خروجی query عجق وجق هست یا نه فایل sql رو نگذار خروجی رو بگذار
ممکنه SQLyog که فایل sql رو تولید می کنه اینجور کلمات رو به هم بزنه

imanitc
شنبه 04 آبان 1392, 12:22 عصر
ببينيد فيلد title درست ميشه و بر ميگرده ولي فيلد content مشکل پيدا ميکنه يعني شما ميگيد فرمت content - 1252 هست .تست کرديد

rahnema1
شنبه 04 آبان 1392, 17:30 عصر
بله تست کردم
ببینید این فایل های تبدیل شده رو:
112257

imanitc
یک شنبه 05 آبان 1392, 12:18 عصر
ممنون
اگر دقيقا بگيد چطور اين کار کرديد ممنون ميشم من هر روشي بود تست کردم ولي نشد اگر کد تبديل بذاريد خيلي لطف کرديد.ميشه يه کاري کرد فيلد title و content با هم درست بشه؟؟؟

rahnema1
یک شنبه 05 آبان 1392, 12:57 عصر
اول فایل رو به کدپیج 1256 تبدیل می کنیم اگر iconv رو دارید در خط فرمان تایپ کنید:



iconv -c -f UTF-8 -t CP1252 f1.sql>f1256.sql


حالا فایل 1256 رو به utf8 تبدیل می کنیم



iconv -c -f CP1256 -t UTF-8 f1256.sql>futf8.sql

imanitc
یک شنبه 05 آبان 1392, 15:45 عصر
میشه دقیقا بگید این کد باید کجا استفاده کنم این کد الان php یا sql ؟

rahnema1
یک شنبه 05 آبان 1392, 21:08 عصر
توی خط فرمان اگه تو ویندوز استفاده می کنید از cmd اگه تو لینوکس هستید از terminal البته باید برنامه iconv نصب شده باشه

rahnema1
یک شنبه 05 آبان 1392, 21:21 عصر
تحت ویندوز این هم لینک برنامه
http://gnuwin32.sourceforge.net/downlinks/libiconv-bin-zip.php

imanitc
یک شنبه 05 آبان 1392, 23:10 عصر
من دانلود کردم ولی نفهمیدم اینا فایل ها رو کجا بریزم یا نصب کنم چطوری ویندوز 7 دارم ؟

a_ahmadi
یک شنبه 05 آبان 1392, 23:39 عصر
به جای اینهمه دردسر با نرم افزار Notepad++ می تونید 3 کار زیر انجام بدید.
1- یک فایل خالی با یونیکد windows-1252 ایجاد کرده دیتا مورد نظر خود کپی و ذخیره کنید.
2- فرمت فایل شماره یک به یونیکد windows-1256 تغییر دهید در این وضعیت متن شما فارسی خواهد شد.
3- محتویات فایل شماره 2 به فایل جدید دارای یونیکد utf-8 منتقل و ذخیره کنید.

rahnema1
دوشنبه 06 آبان 1392, 05:31 صبح
برای راحتی کار دستورات رو توی یک فایل bat نوشتم کافیه فایل convert.bat به همراه f1.sql را داخل فولدر bin از نرم افزار iconv که گرفتید بریزید و فایل convert.bat را اجرا کنید
112298

rahnema1
دوشنبه 06 آبان 1392, 05:35 صبح
دستور قبلی کار شما رو راه می اندازه اما اگه می خواهید نصب کنید هم محتویات فولدر bin را داخل شاخه c:\windows\system32 بریزید

imanitc
دوشنبه 06 آبان 1392, 06:40 صبح
اين ارور ميده 112300

imanitc
دوشنبه 06 آبان 1392, 07:16 صبح
ممنون با همون notepad++ مشکلم حل شد

rahnema1
دوشنبه 06 آبان 1392, 08:36 صبح
خدا را شکر مشکلتون حل شد اما ظاهرا اون فایلی که دانلود کردید یه چیزی کم داشت این یکی دیگه setup کامله شاید به درد بخوره
http://gnuwin32.sourceforge.net/downlinks/libiconv.php