WordPress 自訂資料表寫入中文變問號

為了實作 WooCommerce 推播通知外掛的發送紀錄,考量到記錄的內容與屬性,我自己開了一張資料表來存放,在本機測試都沒問題,結果放上伺服器後發現到只要欄位裡面有出現中文的地方全部變成問號:

查到的方法都說是要去改資料庫的編碼規則,但由於這外掛會用在不同的主機上,因此這條路行不通,於是在想會不會是資料欄位本身編碼設定的問題,結果用 phpMyAdmin 查看資料表結構的時候發現資料欄位的編碼都被設成拉丁語系:

找到這問題後,在建立資料表時只要在會出現中文的欄位裡面多設定 Charset 就能解決了,具體實作如下:

global $wpdb;

$table_name = $wpdb->prefix . 'db_prefix';

$sql = "CREATE TABLE $table_name (
	`id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
	`user_id` INT,
	`user_info` VARCHAR(255) CHARACTER SET {$wpdb->charset} COLLATE {$wpdb->collate},
	`order_id` INT,
	`notify_type` VARCHAR(255) CHARACTER SET {$wpdb->charset} COLLATE {$wpdb->collate},
	`notify_content` LONGTEXT CHARACTER SET {$wpdb->charset} COLLATE {$wpdb->collate},
	`notify_time` DATETIME,
	`status` VARCHAR(255) CHARACTER SET {$wpdb->charset} COLLATE {$wpdb->collate}
);
DEFAULT CHARACTER SET {$wpdb->charset} COLLATE {$wpdb->collate}";

require_once ABSPATH . 'wp-admin/includes/upgrade.php';
$result = dbDelta( $sql );
AI 文章延伸

讓 AI 幫你讀這篇文章

選擇平台後會自動帶入閱讀脈絡,快速整理重點、補齊盲點,並延伸到同站相關文章。

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *

這個網站採用 Akismet 服務減少垃圾留言。進一步了解 Akismet 如何處理網站訪客的留言資料