سه جا که MySQL به کدگذاری نیاز دارد
- ستون یا جدول: مجموعه نویسهای که دادهها با آن ذخیره میشوند، مثل
utf8mb4،latin1یاcp1256. - اتصال: مجموعه نویسهای که کلاینت و سرور با آن حرف میزنند – با
SET NAMES utf8mb4یا در تنظیمات اتصال. - فایل: کدگذاری خواندن درونریزی یا نوشتن خروجی – در phpMyAdmin زیر مجموعه نویسه فایل (Character set of the file).
اگر این سه نخوانند، نویسهها خراب میشوند. رایجترین حالت: متن UTF-8 از اتصال latin1 در ستون latin1 نوشته شده است. برنامه سالم به نظر میرسد، اما phpMyAdmin و خروجی، حروف فارسی را خراب نشان میدهند.
قبل
"1","ط¹ظ„غŒ ع©ط±غŒظ…غŒ","ط®غŒط§ط¨ط§ظ† ظˆظ„غŒط¹طµط±","طھظ‡ط±ط§ظ†"
بعد
"1","علی کریمی","خیابان ولیعصر","تهران"
مجموعه نویسهها را بررسی کنید
SHOW VARIABLES LIKE 'character_set%';تنظیمات سرور و اتصال را نشان میدهد.SHOW CREATE TABLE customers;مجموعه نویسه جدول و ستونها را نشان میدهد.SELECT name, HEX(name) FROM customers LIMIT 5;بایتهای واقعی را نشان میدهد: در ستونutf8mb4حروف فارسی باD8یاD9شروع میشوند؛C398یعنی متن خراب که دو بار کدگذاری شده است.
یک خروجی یا پشتیبان را درست کنید
- جدول را در phpMyAdmin بهصورت SQL یا CSV خروجی بگیرید – یا با
mysqldump --default-character-set=utf8mb4. - فایل را در کادر بالا رها کنید. Mojibuster فقط جاهای خراب را درست میکند؛ نویسههای سالم دستنخورده میمانند.
- جاهای اصلاحشده را زیر چه چیزی تغییر کرد؟ ببینید و فایل را دانلود کنید.
- آن را در جدولی با
utf8mb4درونریزی کنید و در پنجره درونریزیutf-8را انتخاب کنید. - قبل از جایگزینی جدول اصلی، اول روی یک نسخه آزمایش کنید.
خروجی هرگز از رایانه شما بیرون نمیرود – برای دادههای مشتریان مهم است. درباره ماهیت این نویسهها در موجیباکه چیست بخوانید.
علت را برطرف کنید
- جدولهای جدید را با
DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ciبسازید. - اتصال برنامه را روی
utf8mb4بگذارید؛ در PHP مثلاً باcharset=utf8mb4در DSN مربوط به PDO. - اگر بایتهای UTF-8 در ستون
latin1هستند، مستقیم باCONVERT TOتبدیلش نکنید – دوباره کدگذاری میشود و متن خرابتر میشود. راه امن از نوع دودویی میگذرد: اولMODIFY name VARBINARY(255)و بعدMODIFY name VARCHAR(255) CHARACTER SET utf8mb4. - اگر MySQL نویسهها را با
?جایگزین کرده، ستون یا اتصال نمیتوانست آنها را نشان دهد. آنچه اینطور ذخیره شده از بین رفته – بیشتر در پرسش «چرا به جای متن فارسی علامت سؤال دیده میشود؟» در موجیباکه چیست.
پرسشهای متداول
چرا در برنامهام همهچیز درست است ولی در phpMyAdmin نه؟
چون برنامه و پایگاه داده یک اشتباه را دو بار انجام میدهند: برنامه UTF-8 را از اتصال latin1 مینویسد و همانطور هم میخواند. phpMyAdmin درست وصل میشود و همان چیزی را نشان میدهد که واقعاً ذخیره شده است. اگر فارسی پس از انتقال سایت خراب شده، وردپرس و پایگاه داده و کدگذاری دوباره را هم ببینید.
کدام collation را برای فارسی انتخاب کنم؟
utf8mb4_unicode_ci برای بیشتر برنامهها مناسب است؛ از MySQL 8 پیشفرض utf8mb4_0900_ai_ci است. مهمتر خود مجموعه نویسه utf8mb4 است، نه utf8 که در MySQL ایموجی ذخیره نمیکند.
با MariaDB هم کار میکند؟
بله. MariaDB مجموعه نویسهها را مثل MySQL مدیریت میکند و دستورها یکیاند.
فایل پشتیبان تا چه اندازه میتواند باشد؟
تا ۱۰۰ مگابایت برای هر فایل. پایگاههای بزرگتر را جدول به جدول خروجی بگیرید.