结论与最佳实践:1. 数据库统一使用utf8mb4字符集,建表时指定CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;2. PHP连接MySQL时设置'mysql:charset=utf8mb4';3. 网页头部输出<meta charset="utf8mb4">;4. PHP文件保存为UTF-8无BOM格式;5. mysqli_query执行SET NAMES utf8mb4;这样就能彻底解决中文乱码问题。
来源1
首先,数据库的字符集设置至关重要。在创建数据库时,执行SQL语句:CREATE DATABASE your_db_name CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; 然后建表时同样指定:CREATE TABLE your_table (id INT, content TEXT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci); 这样数据库就能正确存储中文。
来源2
PHP连接数据库时,用PDO:$pdo = new PDO('mysql:host=localhost;dbname=your_db;charset=utf8mb4', $user, $pass); 或者mysqli:$mysqli = new mysqli($host, $user, $pass, $db); $mysqli->set_charset('utf8mb4'); 连接后立即设置字符集,避免传输乱码。
来源3
网页显示优化:在HTML头部加<meta http-equiv="Content-Type" content="text/html; charset=utf8mb4" /> PHP输出前header('Content-Type: text/html; charset=utf8mb4'); 如果用htmlspecialchars输出变量,指定第三个参数:htmlspecialchars($str, ENT_QUOTES, 'utf-8');
来源4
开发者热议:很多人说UTF-8不够用,必须用utf8mb4支持表情符号。另一个问题是编辑器保存文件时选UTF-8无BOM,不然开头有BOM字节导致乱码。还有人分享:用iconv('GBK','UTF-8',$str)转换老数据。
来源5
最佳实践是从头到尾统一UTF-8:1.服务器PHP文件UTF-8;2.数据库utf8mb4;3.前端meta utf8;4.连接set_charset utf8mb4;5.读写数据不转码。测试时用phpinfo()查default_charset是否utf8。
来源6
常见坑:MySQL 5.5前utf8是3字节,中文ok但emoji乱码,升级utf8mb4。Windows下phpMyAdmin默认latin1,手动改config.inc.php $cfg['DefaultCharset'] = 'utf8mb4';
FAQ
Q: 为什么数据库设了utf8还是乱码?
A: 因为连接没设charset,执行SET NAMES utf8mb4;
Q: PHP怎么查页面编码?
A: 用phpinfo()看Content-Type,或者浏览器F12查response header。
Q: 老项目GBK怎么转UTF8?
A: 先备份,改数据库字符集,再用ALTER TABLE CONVERT TO CHARACTER SET utf8mb4;
Q: 前端JavaScript有乱码?
A: json_encode加JSON_UNESCAPED_UNICODE参数。