MariaDB含扩展字符的SELECT查询无结果,编码问题求助
解决utf8网站与utf8mb4数据库的LIKE查询匹配问题
强制设置数据库连接字符集为utf8mb4
网站编码是utf8,但数据库用的是utf8mb4,必须让PHP和数据库的连接字符集统一为utf8mb4,否则查询语句里的扩展字符会因为编码转换不匹配导致匹配失败。- PDO连接示例:
// 方式一:在DSN中指定字符集 $dsn = 'mysql:host=localhost;dbname=你的数据库名;charset=utf8mb4'; $cn = new PDO($dsn, '用户名', '密码'); // 方式二:连接后执行SQL设置 $cn->exec("SET NAMES utf8mb4"); - mysqli连接示例:
mysqli_set_charset($cn, 'utf8mb4');
- PDO连接示例:
确认PHP文件编码与字符串一致性
确保你的PHP代码文件本身是以UTF-8(无BOM)格式保存的,这样代码里的'máchtig'字符串才是正确的UTF-8编码,避免因文件编码问题导致字符发送到数据库时乱码。不要手动调用utf8_encode或utf8_decode这类函数,反而会破坏原有编码。检查并修正字段的排序规则
数据表informatie的对应字段必须使用utf8mb4系列的排序规则,否则字符比较逻辑会和连接字符集不匹配。- 先查看当前字段的设置:
SHOW CREATE TABLE informatie; - 如果排序规则不是utf8mb4开头的,执行修改语句:
ALTER TABLE informatie MODIFY COLUMN informatie TEXT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
(注:根据字段实际类型调整
TEXT,比如是VARCHAR就改成VARCHAR(255))- 先查看当前字段的设置:
改用预处理语句(推荐)
直接拼接字符串到SQL不仅有注入风险,还可能因编码处理不当导致匹配问题。用预处理语句能让数据库自动处理字符匹配逻辑:$stmt = $cn->prepare("SELECT * FROM informatie WHERE informatie LIKE ?"); $searchKeyword = '%máchtig%'; $stmt->execute([$searchKeyword]); $resultRows = $stmt->fetchAll(PDO::FETCH_ASSOC);
内容的提问来源于stack exchange,提问作者user3095854
相关产品推荐
相关产品推荐

