رفع مشکل کدگذاری فارسی در MySQL و phpMyAdmin

phpMyAdmin، فایل SQL یا برنامه‌تان به جای فارسی ؟؟؟ یا نویسه‌هایی مثل ط¹ظ„غŒ نشان می‌دهد؟ معمولاً کدگذاری جدول، اتصال و درون‌ریزی با هم نمی‌خوانند. Mojibuster خروجی را در مرورگر شما درست می‌کند؛ بعد MySQL را برای همیشه درست تنظیم کنید.

با متن و این فایل‌ها کار می‌کند:

  • CSV
  • TXT
  • JSON
  • XML
  • SRT
  • VTT
  • SMI
  • TSV
  • MD
  • HTML
  • SQL
  • LOG

مثل خروجی اکسل، نسخه پشتیبان پایگاه داده، زیرنویس و کد وب‌سایت.

اصلاح

  1. فایل را بکشید یا متن را بچسبانید
  2. اصلاح خودکار انجام می‌شود
  3. نتیجه را کپی یا دانلود کنید
یا فایل را اینجا بکشید
  • بدون آپلود. فایل‌ها مستقیم داخل مرورگر شما اصلاح می‌شوند و هرگز از دستگاهتان خارج نمی‌شوند.

  • سرور در اتحادیه اروپا. Mojibuster روی سروری در فنلاند (اتحادیه اروپا) اجرا می‌شود؛ بنابراین مقررات عمومی حفاظت از داده‌ها (GDPR) برقرار است. متن مقررات (EUR-Lex، به انگلیسی)

سه جا که MySQL به کدگذاری نیاز دارد

  • ستون یا جدول: مجموعه نویسه‌ای که داده‌ها با آن ذخیره می‌شوند، مثل utf8mb4، latin1 یا cp1256.
  • اتصال: مجموعه نویسه‌ای که کلاینت و سرور با آن حرف می‌زنند – با SET NAMES utf8mb4 یا در تنظیمات اتصال.
  • فایل: کدگذاری خواندن درون‌ریزی یا نوشتن خروجی – در phpMyAdmin زیر مجموعه نویسه فایل (Character set of the file).

اگر این سه نخوانند، نویسه‌ها خراب می‌شوند. رایج‌ترین حالت: متن UTF-8 از اتصال latin1 در ستون latin1 نوشته شده است. برنامه سالم به نظر می‌رسد، اما phpMyAdmin و خروجی، حروف فارسی را خراب نشان می‌دهند.

یک ردیف از خروجی CSV در phpMyAdmin

قبل

"1","ط¹ظ„غŒ ع©ط±غŒظ…غŒ","ط®غŒط§ط¨ط§ظ† ظˆظ„غŒط¹طµط±","طھظ‡ط±ط§ظ†"

بعد

"1","علی کریمی","خیابان ولیعصر","تهران"

مجموعه نویسه‌ها را بررسی کنید

  • SHOW VARIABLES LIKE 'character_set%'; تنظیمات سرور و اتصال را نشان می‌دهد.
  • SHOW CREATE TABLE customers; مجموعه نویسه جدول و ستون‌ها را نشان می‌دهد.
  • SELECT name, HEX(name) FROM customers LIMIT 5; بایت‌های واقعی را نشان می‌دهد: در ستون utf8mb4 حروف فارسی با D8 یا D9 شروع می‌شوند؛ C398 یعنی متن خراب که دو بار کدگذاری شده است.

یک خروجی یا پشتیبان را درست کنید

  1. جدول را در phpMyAdmin به‌صورت SQL یا CSV خروجی بگیرید – یا با mysqldump --default-character-set=utf8mb4.
  2. فایل را در کادر بالا رها کنید. Mojibuster فقط جاهای خراب را درست می‌کند؛ نویسه‌های سالم دست‌نخورده می‌مانند.
  3. جاهای اصلاح‌شده را زیر چه چیزی تغییر کرد؟ ببینید و فایل را دانلود کنید.
  4. آن را در جدولی با utf8mb4 درون‌ریزی کنید و در پنجره درون‌ریزی utf-8 را انتخاب کنید.
  5. قبل از جایگزینی جدول اصلی، اول روی یک نسخه آزمایش کنید.

خروجی هرگز از رایانه شما بیرون نمی‌رود – برای داده‌های مشتریان مهم است. درباره ماهیت این نویسه‌ها در موجیباکه چیست بخوانید.

علت را برطرف کنید

  • جدول‌های جدید را با 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 مدیریت می‌کند و دستورها یکی‌اند.

فایل پشتیبان تا چه اندازه می‌تواند باشد؟

تا ۱۰۰ مگابایت برای هر فایل. پایگاه‌های بزرگ‌تر را جدول به جدول خروجی بگیرید.

راهنماهای دیگر