風景.jpg),頁面能正常顯示。filename 字段存入後變成 ????.jpg 或亂碼。header('charset=gbk')、MySQL 連接 SET NAMES gbk、腳本文件 ANSI 編碼、表校對 gbk_general_ci、數據庫字符集 utf8。編碼鏈路不一致:PHP 腳本文件編碼(ANSI/GBK)與數據庫字符集(UTF8)不匹配,導致中文在寫入時按錯誤編碼解析,存入問號。
SET NAMES gbk 告訴 MySQL「客戶端發送的是 GBK」,但實際 PHP 發送的是 UTF-8(若文件存為 UTF-8)或 ANSI,導致 MySQL 按 GBK 解碼失敗。header('charset=gbk'),改為 header('Content-Type: text/html; charset=utf-8')。mysqli_set_charset($link, 'utf8mb4'); // 推薦 utf8mb4 支援 Emoji
// 或 PDO
$pdo = new PDO("mysql:host=...;dbname=...;charset=utf8mb4", $user, $pass);
ALTER DATABASE db_name CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;
ALTER TABLE tbl_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
<meta charset="utf-8">。iconv('utf-8', 'gbk', $filename) 轉碼後再 move_uploaded_file。上傳 測試圖片.png,檢查數據庫 SELECT filename FROM pics 應顯示正確中文;前端 <img src="..."> 正常加載。
utf8mb4)。SET NAMES 僅影響當前連接,推薦在連接參數中指定 charset。