Datatables含重音字符行报错问题求助
解决PDO下带重音字符的表格加载/搜索报错问题
1. 确认数据库、表及字段的字符集配置
先确保存储层面的编码统一为utf8mb4,且排序规则采用支持重音字符的utf8mb4_unicode_ci:
- 执行以下SQL验证当前配置:
-- 检查数据库字符集 SELECT DEFAULT_CHARACTER_SET_NAME, DEFAULT_COLLATION_NAME FROM INFORMATION_SCHEMA.SCHEMATA WHERE SCHEMA_NAME = '你的数据库名'; -- 检查表字符集 SELECT CCSA.character_set_name FROM information_schema.`TABLES` T, information_schema.`COLLATION_CHARACTER_SET_APPLICABILITY` CCSA WHERE CCSA.collation_name = T.table_collation AND T.table_schema = '你的数据库名' AND T.table_name = '你的表名'; -- 检查字段字符集 SELECT character_set_name FROM INFORMATION_SCHEMA.COLUMNS WHERE table_schema = '你的数据库名' AND table_name = '你的表名' AND column_name = '客户字段名';
- 若结果不符合要求,执行修改语句:
ALTER DATABASE 你的数据库名 CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; ALTER TABLE 你的表名 CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; ALTER TABLE 你的表名 MODIFY COLUMN 客户字段名 VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
2. 优化PDO连接配置
- 给PDO的DSN添加排序规则参数,确保连接层面编码对齐:
$db = new PDO("mysql:host=".DBHOST.";charset=utf8mb4;collation=utf8mb4_unicode_ci;dbname=".DBNAME, DBUSER, DBPASS);
- 开启异常错误模式,方便定位具体报错:
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $db->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
3. 规范搜索查询写法
搜索带重音字符的内容时,必须使用参数化查询,禁止手动拼接SQL,避免编码转义错误:
// 示例:搜索客户字段 $searchTerm = $_GET['search']; $stmt = $db->prepare("SELECT * FROM 客户表 WHERE 客户字段 LIKE CONCAT('%', :term, '%')"); $stmt->bindParam(':term', $searchTerm, PDO::PARAM_STR); $stmt->execute(); $results = $stmt->fetchAll(PDO::FETCH_ASSOC);
4. 确保页面输出编码一致
- 在HTML头部设置编码:
<meta charset="UTF-8">
- 若用PHP直接输出内容,在输出前设置响应头:
header('Content-Type: text/html; charset=utf-8');
5. 清理脏数据与缓存
- 若之前用错误编码插入过数据,重新插入带重音字符的测试数据,确保存储的是正确的
utf8mb4编码内容; - 清理浏览器缓存,避免旧编码缓存影响显示。
内容的提问来源于stack exchange,提问作者DevP7
相关产品推荐
相关产品推荐

