這個最近在寫文章插入 emoji 😁的時候才發現的問題,想說怎麼不能存檔了,因為錯誤訊息只出現 Update database error , apache server 也沒有明顯的 LOG 指出這件事,錯了幾次才抓出是 emoji 的問題
在查找文章的時候有文章就提到
Check Your Current Collation: Look at your database tables. If you see a collation like utf8mb3_unicode_ci, this is likely the cause of the problem. WordPress tables should ideally use utf8mb4_unicode_520
才想到查一下我的 DB 是不是 utf8mb3 ,一查之下果然是,老的 WordPress 用的資料庫果然夠老,轉換資料庫也碰到一些問題,主要是 wp_comments 這個資料庫的問題,可以先去 WordPress comments 刪除所有垃圾留言
在 wp-config.php 內設定成 utf8mb4
define('DB_CHARSET', 'utf8mb4'); define('DB_COLLATE', 'utf8mb4_unicode_ci');
導出 wp_comments 的資料庫
Bash
mysqldump -u [用戶名] -p --skip-set-charset --default-character-set=latin1 [資料庫名] wp_comments > wp_comments.sql
導回 wp_comments 的資料庫
Bash
mysql -u [用戶名] -p --default-character-set=utf8mb4 [資料庫名] < wp_comments.sql
轉換整個資料庫
Bash
#!/bin/bash
DB_NAME="your_database"
USER="your_user"
PASS="your_password"
TABLES=$(mysql -u $USER -p$PASS -Nse "SHOW TABLES;" $DB_NAME)
for TABLE in $TABLES; do
mysql -u $USER -p$PASS -e "ALTER TABLE $TABLE CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;" $DB_NAME
done
DeepSeek 這邊做的非常好,直接給 shell script 幫助完成,Grok 就沒給出這麼方便的 Script.
發佈留言