وردپرس و پایگاه داده: ط³ظ„ط§ظ… یا ???? به‌جای متن فارسی

پس از انتقال به سرور جدید، به‌روزرسانی یا خروجی گرفتن از پایگاه داده، نوشته‌های سایت ناگهان ط³ظ„ط§ظ… به‌جای سلام نشان می‌دهند یا علامت سؤال؟ داده‌ها تقریباً همیشه هنوز هستند، فقط با کدگذاری نادرست خوانده می‌شوند. Mojibuster فایل خروجی را درست می‌کند و بعد علت را خود پایگاه داده برطرف می‌کنید.

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

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

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

اصلاح

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

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

مشکل چه شکلی دارد

یک خط از خروجی SQL پس از انتقال به سرور جدید

قبل

INSERT INTO wp_posts (post_title) VALUES ('ط³ظ„ط§ظ… ط¯ظˆط³طھ ظ…ظ†طŒ ط³ظپط§ط±ط´ ط§ط±ط³ط§ظ„ ط´ط¯');

بعد

INSERT INTO wp_posts (post_title) VALUES ('سلام دوست من، سفارش ارسال شد');

از کجا می‌آید

وردپرس متن را با UTF-8 ذخیره می‌کند. اما بسیاری از نصب‌های قدیمی جدول‌هایشان را با latin1 ساخته‌اند یا با latin1 به پایگاه داده وصل شده‌اند. تا وقتی نوشتن و خواندن یک اشتباه را تکرار کنند، کسی چیزی نمی‌فهمد. پس از انتقال به سرور جدید، خروجی گرفتن با phpMyAdmin یا عوض کردن کدگذاری اتصال، هر حرف فارسی ناگهان دو نویسه می‌شود.

  • DB_CHARSET در wp-config.php برابر latin1 است یا با جدول‌ها نمی‌خواند.
  • خروجی با latin1 گرفته و با utf8mb4 وارد شده است، یا برعکس.
  • افزونه یا اسکریپت درون‌ریزی متن از قبل خراب را یک بار دیگر تبدیل کرده است. این‌طور کدگذاری دوباره پیش می‌آید.

رفع فایل خروجی

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

فایل هیچ‌جا آپلود نمی‌شود. این مهم است، چون معمولاً حساب‌های کاربری، نشانی‌های ایمیل و دیدگاه‌ها در آن هست.

مراقب داده‌های سریال‌شده (serialized) باشید

وردپرس بخشی از تنظیمات را در wp_options و wp_postmeta به‌صورت مقدارهای سریال‌شدهٔ PHP نگه می‌دارد، مثلاً s:8:"سلام";. عدد، طول رشته بر حسب بایت است: در UTF-8 هر حرف فارسی دو بایت است. متن خراب طولی متفاوت از متن اصلاح‌شده دارد، پس پس از اصلاح عدد نمی‌خواند و وردپرس مقدار را دور می‌اندازد. بنابراین اول جدول‌های محتوا مثل wp_posts، wp_comments و wp_terms را درست کنید. برای تنظیمات wp search-replace از WP-CLI بهتر است، چون طول‌ها را به‌روز می‌کند.

رفع علت در MySQL

  • جدول‌ها و اتصال را به utf8mb4 ببرید و در wp-config.php خط define('DB_CHARSET', 'utf8mb4'); را بگذارید.
  • اگر ستون latin1 بایت‌های UTF-8 دارد، آن را مستقیم تبدیل نکنید، وگرنه متن بار دوم کدگذاری می‌شود. راه معمول از نوع دودویی می‌گذرد: اول MODIFY … LONGBLOB و بعد MODIFY … LONGTEXT CHARACTER SET utf8mb4.
  • هر تغییر را اول روی یک کپی از پایگاه داده امتحان کنید.

پرسش‌های متداول

می‌توانم کل پایگاه داده وردپرس را یک‌جا درست کنم؟

بله، حتی فایل‌های بزرگ SQL. فقط به داده‌های سریال‌شده در wp_options و wp_postmeta توجه کنید، چون WP-CLI آن‌ها را بهتر مدیریت می‌کند.

آیا نویسه‌های درست در فایل تغییر می‌کنند؟

نه. Mojibuster فقط دنباله‌هایی را درست می‌کند که به‌روشنی خراب‌اند. متن سالم همان‌طور می‌ماند.

تفاوت utf8 و utf8mb4 چیست؟

در MySQL، utf8 فقط نویسه‌هایی تا سه بایت ذخیره می‌کند، پس ایموجی‌ها از بین می‌روند. utf8mb4 UTF-8 واقعی است و انتخاب درست برای وردپرس است.

برای سیستم‌هایی غیر از وردپرس هم کار می‌کند؟

بله. Joomla، Drupal، Magento یا برنامهٔ خودتان روی MySQL یا MariaDB همین مشکل و همین راه‌حل را دارند.

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