نیما قائدشرفی

گاه نوشته های یک توسعه‌دهنده نرم‌افزار

              

عدم امکان ذخیره اموت ایکون ها در MySQL

پنجشنبه ۱۲ شهریور ۹۴

امروز در پاسخ به کامنت ها متوجه شدم که قسمتی از متن های که نوشتم به طور خاصی نیستند ٬ در ابتدا فکر کردم که مشکل از استفاده از ترکیب شیفت +‌ اینتر برای رفتن به خط بعد هست اما بعد از تست این موضوع متوجه شدم که دلیل این مشکل نبوده و دلیلی که پشت این موضوع وجود داشت استفاده از اموت ایکون ها بود.

این مشکل خیلی ساده حل میشه برای توضیحات بیشتر به ادامه مطلب بروید.

حروف همونطور که در جدول زیر میبینید در حالت مجموعه کارکتری UTF8 از U+0000  شروع میشوند و تا U+FFFF ادامه پیدا می کنند و اموت ایکون ها از بازه U+1F60x شروع میشن و کاملن قابل مشاهده هست که ایکون ها در این بازه رمزنگاری UTF8 قرار می گیرند پس مشکل کجاست که ذخیره نمی شوند؟؟

مشکل اینجاست که MySQL در رمزنگاری  UTF-8 از کل مجموعه که نیاز به ۴ بایت فضا داره استفاده نمیکنه و به دلایلی مثل بهینه سازی و کمینه کردن حجم اطلاعات از نسخه ۳ بایتی این رمزنگاری استفاده می کنه.

اما شرکت اوراکل هم راه حلی برای این موضوع ارائه داده و ان هم استفاده از BMP که مخفف Basic Multilingual Plane در نسخه ۵.۵+ MySQL می باشد.

در نسخه ۵.۵ MySQL مجموعه کارکتر جدیدی اضافه شده به نام UTF8MB4این مجموعه برای ذخیره هر کارکتر نیاز به چهار بایت داره و از BMP هم پشتیبانی میکنه. برای پشتیبانی کردن دیتابیس شما از اموت ایکون ها بعد از اینکه مطمئن شدید سرور شما از MySQL +5.5 استفاده میکنه کافیه مجموعه کارکتری جدول ها و ستون ها را به این مجموعه کارکتری تغییر دهید. برای اینکار می تونید به دیتابیس مراجعه کنید و ستون های که می خواهید رو ویرایش کند. به همین سادگی!

اما اگر شما تعداد زیادی جدول و ستون داشته باشید که نیاز به تغییر مجموعه کارکتری داشته باشن. تغییر مجموعه کارکتری تک به تک فیلد ها به صورت دستی کار خیلی سختی هست. اما نگران نباشد کامپیوتر برای همین موضوع طراحی شده هست.

شما با نوشتن نام جدول به جای mytable و اجرای کوئری زیر می تونید به راحتی این کار رو انجام بدید.

ALTER TABLE mytable CONVERT TO CHARACTER SET utf8

و یا اگر میخواید باز هم ساده تر این کار رو انجام بدید می تونید بعد از وصل شدن به دیتابیس این کد PHP را اجرا کنید.

try {
    $result = $connection->query("SHOW TABLES");
    while ( $table = $result->fetch_object() ) {
        $connection->query("ALTER TABLE $table CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci");
    }
} catch (Exception $e) {
    throw $e;
}

امیدوارم مفید بوده باشه.

دیدگاه های شما