صفحة 1 من 2 12 الأخيرةالأخيرة
النتائج 1 إلى 15 من 22

الموضوع: الابقاء على البيانات بعد تحويلها الى utf8

  1. #1
    عضو نشيط جدا
    تاريخ التسجيل
    Apr 2008
    المشاركات
    361

    الابقاء على البيانات بعد تحويلها الى utf8



    السلام عليكم،

    قمت بتعديل ترميز احدى قواعد البيانات من latin1 الى utf8.

    كما قمت يتعديل ترميز الصفحات واضافة السطر :



    كود PHP:
    mysql_set_charset("utf8"




    بعد عمل إتصال بالقاعدة.

    وعند تجريب اضافة بيانات ياللغة العربية جديدة تظهر في القاعدة والمتصفح باللغة العربية بشكل ممتاز.

    ولكن البيانات القديمة كلها اصبحت تظهر في المتصفح وحتى القاعدة بحروف غير مفهومة وبشكل معينات.

    فهل من حل للابقاء على البيانات السابقة بدون تغيير بعد الانتقال من ترميز latin1 الى utf8 ؟

    شكرا للمساعدة





    الملفات المرفقة الملفات المرفقة
    • نوع الملف: zip utf8.zip‏ (11.8 كيلوبايت, 123 مشاهدات)
    __________________
    مجلتي الصغيرة


  2. #2
    عضو نشيط جدا
    تاريخ التسجيل
    Dec 2004
    المشاركات
    364


    اذا كنت تستخدم ترميز أسكي ASCII سابقا لحفظ بياناتك على القاعدة، وقمت بتحويل بنية القاعدة إلى UTF8، فإن السيرفر سيبدأ بقراءة البيانات السابقة بترميز غير صحيح

    الحل

    ان تقوم بتحويل ترميز البيانات السابقة إلى UTF8

    هذا سيحتاج إلى عمل برمجي من نوع ما
    أعطيك مثال لحل مقترح
    اقرأ البيانات من القاعدة بالترميز الأساسي Latin1، وقم بحفظها في مصفوفات
    ثم قم بتحويل ترميز الاتصال بالقاعدة إلى UTF8
    كود:
    mysql_query("SET NAMES 'utf8' ");
    ثم تقوم بعمل update للسجلات بالبيانات نفسها بالترميز الجديد

    هذا حل مقترح، قم بتجربته





    __________________
    الخدمات البرمجية
    تعديلات برمجية - تطوير برمجيات جاهزة - صيانة قواعد بيانات
    برمجة خاصة (الأولوية للأفكار الجديدة والخاصة)

    المراسلة : http://it.rewaq.com

  3. #3
    عضو نشيط جدا
    تاريخ التسجيل
    Aug 2008
    المشاركات
    324


    حل القائد جيد لكن عندي حل شامل المشكل انك قمت تغير الترميز

    فقط اعد تحميل قاعدة البيانات من غير تحويل الترميز إلي utf اي اتركه latin1

    واستعمل هذا الفنكشن داخل ملف منفرد قم بمناداته من المستعرض سيقوم بتغير الترميز + تغير ترميز البيانات
    إلي utf بشكل ممتاز
    كود PHP:

    <?php

    function MysqlError()
    {
            if (
    mysql_errno())
            {
                    echo 
    "<b>Mysql Error: " mysql_error() . "</b>\n";
            }
    }

    $username "root";
    $password "pass";
    $db "yourdata";
    $host "localhost";

    $target_charset "utf8";
    $target_collate "utf8_general_ci";

    //$target_charset = "";
    //$target_collate = "";

    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] == "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}");
                            
    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}");
                            
    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}");
                            
    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}");
                            
    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}");
                            
    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}");
                            
    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>";
    لا تنسي إضافة لملف الإتصال عندك
    كود PHP:

     
    @mysql_set_charset('utf8');
          @
    mysql_query('SET NAMES utf8');
          @
    mysql_query('SET CHARACTER SET utf8');
          @
    mysql_query('SET COLLATION_CONNECTION="utf8_general_ci"'); 

    بالطبع يبقي عمل النسخ لقاعدة البيانات والزرع مرة اخري

    إستعمل هذا السكريبت الممتاز في نسخ قواعد البيانات وإعادة الزرع عند الحاجة من هنا


    http://sypex.net/files/SypexDumper_208.zip


    هذا إن شاء الله الحل النهائي لترميز قواعد البيانات انشروا هذه الصفحة للإستفادة

    وموفقين إن شاء الله





    التعديل الأخير تم بواسطة zamile28 ; 13-04-2011 الساعة 09:30 PM

  4. #4
    عضو نشيط جدا
    تاريخ التسجيل
    Apr 2008
    المشاركات
    361


    من خلال الملفات المرفقة اقوم يثلاث خطوات :

    1 - استرجاع البيانات عن طريق الملف get_datas.php وحفظها في ملف update.sql.

    2 - تحديث وتغيير ترميز القاعدة من latin1 الى UTF8 عن طريق الملف update_encoding.php

    3 - اعادة ادخال البيانات الى القاعدة بالترميز الجديد عن طريق الملف update_datas.php.

    ولكن المشكلة ما زالت قائمة والبانات كما استرجعها من latin1 اجد نفسها بالقاعدة تحت ترميز UTF8.

    هناك مشكل ما من الترميز حتماً.





    __________________
    مجلتي الصغيرة

  5. #5
    عضو نشيط جدا
    تاريخ التسجيل
    Apr 2008
    المشاركات
    361


    لم ار اجابتك اخي زميل.

    فعلا استعملت يدويا في PHPMyadmin طريقتك لاني وجدتها مذكورة في الوورد برس.

    http://codex.wordpress.org/User:Jere...UTF8Conversion

    ولم تفلح معي.

    ولكن ساعيد تجريتها مرة ثانية ان شاء الله.





    __________________
    مجلتي الصغيرة

  6. #6
    عضو نشيط جدا
    تاريخ التسجيل
    Apr 2008
    المشاركات
    361


    كيف يعمل هذا السكريبت ؟

    http://sypex.net/files/SypexDumper_208.zip





    __________________
    مجلتي الصغيرة

  7. #7
    عضو نشيط جدا
    تاريخ التسجيل
    Aug 2008
    المشاركات
    324


    الفنكشن الذي اعطيتك فوق يعمل بشكل ممتاز ومجرب

    سبب فشل المحاولة الاولي لان قلت لك لا تغير الترميز حتي يتمكن السكريبت من العمل

    يغير الترميز + تحويل البيانات utf

    مرة واحدة وبسرعة


    هذا ملف اللغة العربية لسكريبت نسخ وزرع قواعد البيانات اعلي

    http://sypex.net/files/sxd2_lang_ar_by_Reko24.zip

    اما إذا اردت مثل ماقال القائد

    أعطيك مثال لحل مقترح
    اقرأ البيانات من القاعدة بالترميز الأساسي Latin1، وقم بحفظها في مصفوفات
    ثم قم بتحويل ترميز الاتصال بالقاعدة إلى UTF8

    تفضل هذه هي الطريقة الصحيحة اجلب البيانات حولها لutf ب iconv

    ثم اعد زرعاتها

    إليك سكربيتك مع التعديل
    كود PHP:

    <?php
     header
    ('(anti-spam-content-type:) text/html; charset=utf-8' );
    $sql_text="";
    $sql="select * from tab1 order by id DESC";
    $res=mysql_query($sql);
    mysql_query("SET NAMES 'utf8'");
    mysql_query('SET CHARACTER SET utf8');

    while(
    $row=mysql_fetch_object($res)){


    $name  iconv('windows-1256','utf-8',$row->name);


        
    $sql_text.="UPDATE `article` SET `name` ='$name',
        `country`='
    $row->country',
        `town`='
    $row->town'
        where `id` = '
    $row->id' ;
        "
    ;
    }
    highlight_string($sql_text);
    $file="update.sql";
    $fp=fopen($file"w"); 
    fwrite($fp,$sql_text);
    fclose($fp); 
    ?>







  8. #8
    عضو نشيط جدا
    تاريخ التسجيل
    Apr 2008
    المشاركات
    361


    البيانات كانت على الشكل ؟؟؟؟

    وبعد الاسترجاع والادخال بقيت على نفس الحال.

    ؟؟؟؟؟؟؟

    ما الحل ؟

    UPDATE `tab1` SET `name` ='????',
    `country`='??????',
    `town`='????'
    where `id` = '2' ;
    UPDATE `tab1` SET `name` ='????',
    `country`='?????',
    `town`='????'
    where `id` = '1' ;






    التعديل الأخير تم بواسطة apitos ; 14-04-2011 الساعة 06:37 PM
    __________________
    مجلتي الصغيرة

  9. #9
    عضو نشيط جدا
    تاريخ التسجيل
    Aug 2008
    المشاركات
    324


    هل تقصد البيانات الاصلية بهذا الشكل ؟؟؟؟

    إن كان كذلك فهذه ليست ترميز latin 1 ولا اي ترميز اخر .

    إبدا من الاول.






  10. #10
    عضو نشيط جدا
    تاريخ التسجيل
    Apr 2008
    المشاركات
    361


    تحققت من القاعدة.

    كنت قد انشأتها تحت ترميز PHPMyadmin UTF8.

    فقمت باستبداله الى الترميز latin1_swedish_ci

    وجربت ادخال البيانات فاصبحت تبدو في القاعدة هكذا : ßÑÈáÇÁ

    ولكن لما اردت استعراض الترميز المستعمل عموما في القاعدة

    كود PHP:
    SELECT CHARSET ((DATABASE()));

    SELECT COLLATION ((DATABASE())); 
    وجدت ان

    charset = utf8
    collation = utf8-general_ci





    التعديل الأخير تم بواسطة apitos ; 15-04-2011 الساعة 08:46 PM
    __________________
    مجلتي الصغيرة

  11. #11
    عضو نشيط جدا
    تاريخ التسجيل
    Apr 2008
    المشاركات
    361


    قمت يتعدي ملف get_datas.php الى :

    كود PHP:
    <?php
    header
    ('(anti-spam-(anti-spam-content-type:)) text/html; charset=utf-8' );
    include (
    "config.php");
    $sql_text="";
    $sql="select * from tab1 order by id DESC";
    $res=mysql_query($sql);
    mysql_query("SET NAMES 'utf8'");
    mysql_query('SET CHARACTER SET utf8');

    while(
    $row=mysql_fetch_object($res)){


    $name  iconv('windows-1256','utf-8',$row->name);


        
    $sql_text.="UPDATE `tab1` SET `name` ='$name',
        `country`='
    $row->country',
        `town`='
    $row->town'
        where `id` = '
    $row->id' ;
        "
    ;
    }
    highlight_string($sql_text);
    $file="update.sql";
    $fp=fopen($file"w"); 
    fwrite($fp,$sql_text);
    fclose($fp); 
    ?>


    وتعديل ملف config.php الى :

    كود PHP:
    <?php
    // DB login information
    $username 'root';
    $password 'root';
    $database 'db_test';
    $host     'localhost';

    $Charset "utf8"

    $link mysql_connect($host$username$password);

    $char mysql_query("SELECT CHARSET (DATABASE())") or die (mysql_error());
    $coll mysql_query("SELECT COLLATION (DATABASE())") or die (mysql_error());
    $chmysql_fetch_array($char);
    $clmysql_fetch_array($coll);
    echo 
    "char = ".$ch[0]."<br />";
    echo 
    "coll = ".$cl[0]."<br />";
    //mysql_set_charset($Charset,$link);  
    //mysql_query("SET NAMES $Charset;", $link) or die ('Erreur de connexion au serveur: '.mysql_error());

    mysql_select_db($database);
    //mysql_set_charset("utf8");
    ?>
    مع حفظ الملفين تحت ترميز ANSI.

    فكان ملف update.sql الناتج :

    كود PHP:
    char utf8
    coll 
    utf8_general_ci
     UPDATE 
    `tab1SET `name` =''
        `
    country`=''
        `
    town`='' 
        
    where `id` = '14' 
        
    UPDATE `tab1SET `name` =''
        `
    country`=''
        `
    town`='' 
        
    where `id` = '13' 
        
    UPDATE `tab1SET `name` =''
        `
    country`=''
        `
    town`='' 
        
    where `id` = '12' 
        
    UPDATE `tab1SET `name` =''
        `
    country`=''
        `
    town`='' 
        
    where `id` = '11' 
        
    UPDATE `tab1SET `name` =''
        `
    country`=''
        `
    town`='' 
        
    where `id` = '10' 
        
    UPDATE `tab1SET `name` =''
        `
    country`=''
        `
    town`='' 
        
    where `id` = '9' 
        
    UPDATE `tab1SET `name` ='ط¹ط§ط¯ظ„'
        `
    country`='سوريا'
        `
    town`='حماة' 
        
    where `id` = '8' 
        
    UPDATE `tab1SET `name` ='ط¹ظ„ظٹ'
        `
    country`='العراق'
        `
    town`='البغدادية' 
        
    where `id` = '7' 
        
    UPDATE `tab1SET `name` ='ظپظٹطµظ„'
        `
    country`='السعودية'
        `
    town`='الرياض' 
        
    where `id` = '6' 
        
    UPDATE `tab1SET `name` ='ط§ط­ظ…ط¯'
        `
    country`='مصر'
        `
    town`='بور سعيد' 
        
    where `id` = '5' 
        
    UPDATE `tab1SET `name` ='ط¹ظ…ط±'
        `
    country`='العراق'
        `
    town`='كربلاء' 
        
    where `id` = '4' 
    نلاحظ ان الاسم لعد استعمال iconv اصبح من الحرف العربي الى هذا
    كود PHP:
    ط¹ظ…ط± 
    ما مفهوم هذا ؟

    شكراً.





    __________________
    مجلتي الصغيرة

  12. #12
    عضو سوبر نشيط
    تاريخ التسجيل
    May 2007
    المشاركات
    947


    كتبت رد وقمت بتعديله بعد مشاهدة الملفات لان ترميز الملفات utf8
    جدول tab1 لديك بترميز latin1 وهو الواضح من الملف المرفق
    ENGINE=MyISAM DEFAULT CHARSET=latin1
    قم بتعديلها الى
    ENGINE=MyISAM DEFAULT CHARSET=utf8
    وقم بالتجربة مرة اخرى





    التعديل الأخير تم بواسطة مهندس مصرى ; 15-04-2011 الساعة 10:31 PM
    __________________
    قل اللهم مالك المُلك تؤتي الملك من تشاء وتنزع الملك ممن تشاء وتعز من تشاء وتذل من تشاء بيدك الخير انك على كل شىء قدير

  13. #13
    عضو نشيط جدا
    تاريخ التسجيل
    Apr 2008
    المشاركات
    361


    أهلا اخي مهندس مصري.

    أريد استرجاع البيانات بترميز latin1 قبل تبديل الكل الى utf8.

    لاني لن استطيع الاستفادة من البيانات اذا حولت ترميز الكل الى utf8 مباشرة كما اشرت علي لانها ستفسد.





    __________________
    مجلتي الصغيرة

  14. #14
    عضو سوبر نشيط
    تاريخ التسجيل
    May 2007
    المشاركات
    947


    في ملف get_datas.php ما رأيك أن تضيف السطر التالي اعلى الملف بعد كود الهيدر مباشرة ..
    كود PHP:
     echo '<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />'
    او قم بتعديل ترميز الملف نفسه الى utf-8 ولا تكتفي باضافة هيدر utf-8

    اما عن نقل البيانات فهذا يستلزم منك اجراء تعديل على كل البيانات الموجودة داخل قاعدة البيانات ..
    • قم بانشاء قاعدة بيانات جديدة بترميز utf8 بنفس الجداول والحقول الموجودة في قاعدة البيانات القديمة ولا تضع بها اي داتا (وقم بمراعاة ان يكون الجداول والحقول وقاعدة البيانات جميعا بترميز utf8).
    • قم بعمل اسكربت بسيط يقوم بعمل اتصالين في نفس الملف اتصال على قاعدة البيانات القديمة واتصال على قاعدة البيانات الجديدة على سبيل المثال سنسمي الاتصال الاول $conn1 والاتصال الثاني $conn2 .
    لو كان لديك مثلا جدول tab1 والحقل title ساوضح كيف يتم اجراء تعديل عليه ونقله بترميز جديد..

    كود PHP:
    $query1 mysql_query("select `title` from `tab1`,$conn1);
    while(
    $fetch = mysql_fetch_array($query1)){
        
    $title = iconv('cp1256','utf-8',$fetch['title']);
        mysql_query("
    insert into `tab1` (`title`) values (' " . $title . "')",$conn2);

    عند استخدام iconv فالترميز الصحيح الذي يجب استخدامه داخل الامر iconv هو cp1256 وليس windows-1256.

    هناك حل آخر وهو ان تقوم بتجربة حل السكربت الذي وضعه zamile28 .. ولم اجربه من قبل لكن اطلعت الان على شفيرته البرمجية فوجدت انه غير آمن لانه يقوم بتعديل البيانات في نفس القاعدة لذلك قد يحدث خطأ معين اثناء التعديل فبالتالي تحدث لديك مشاكل في قاعدة البيانات لأنه سيكون هناك بعض الداتا محولة والباقي غير محول .. لذلك اذا اردت استخدامه قم بعمل نسخة احتياطية اولاً من قاعدة البيانات.





    __________________
    قل اللهم مالك المُلك تؤتي الملك من تشاء وتنزع الملك ممن تشاء وتعز من تشاء وتذل من تشاء بيدك الخير انك على كل شىء قدير

  15. #15
    عضو نشيط جدا
    تاريخ التسجيل
    Apr 2008
    المشاركات
    361


    اخي مهندس مصري :

    هل اطلعت على هذا الرابط :

    http://codex.wordpress.org/User:Jere...UTF8Conversion

    فهم يقومون :

    بنقل البيانات وتغيير ترميز القاعدة ثم ادراجها في نفس القاعدة ....

    كيف استفيد من تلك العملية اليدوية بعملها برمجيا كما في ملفاتي ؟

    شكرا مسبقا ؟





    __________________
    مجلتي الصغيرة





ضوابط المشاركة

  • لا تستطيع إضافة مواضيع جديدة
  • لا تستطيع الرد على المواضيع
  • لا تستطيع إرفاق ملفات
  • لا تستطيع تعديل مشاركاتك
  •  

أضف موقعك هنا| اخبار السيارات | حراج | شقق للايجار في الكويت | بيوت للبيع في الكويت | دليل الكويت العقاري | مقروء | شركة كشف تسربات المياه | شركة عزل اسطح بالرياض | عزل فوم بالرياض| عزل اسطح بالرياض | كشف تسربات المياة بالرياض | شركة عزل اسطح بالرياض