PostgreSQL中JSON列LIKE查询希腊字符无结果问题排查
PostgreSQL JSON列希腊字符LIKE查询失败的解决方法
确认编码一致性
数据库、表及客户端连接必须统一使用UTF-8编码:- 检查数据库编码:
SELECT pg_encoding_to_char(encoding) FROM pg_database WHERE datname = '你的数据库名'; - PHP连接PostgreSQL时指定UTF-8编码(以PDO为例):
$pdo = new PDO("pgsql:host=localhost;dbname=你的数据库;charset=utf8", $用户名, $密码);
编码不匹配会直接导致希腊字符无法正确识别和匹配。
- 检查数据库编码:
改用JSON函数提取字段后匹配
不要直接将JSON列转成text进行匹配,因为JSON列转text会包含结构符号(如引号、大括号),且存储的字符串可能存在转义。正确做法是用->>提取JSON内的目标字段:SELECT * FROM tableX WHERE ("text"->>'text') LIKE '%Αναμονή Ενημέρωσης από%';这里
"text"->>'text'表示从名为text的JSON列中,提取键为text的字符串值,直接匹配实际存储的文本内容。修正PHP的json_encode参数
默认json_encode会将希腊字符转成Unicode转义序列,与数据库中存储的原始字符不匹配。需添加JSON_UNESCAPED_UNICODE参数避免转义,同时去掉编码后多余的引号:$searchStr = "Αναμονή Ενημέρωσης από"; // 生成不转义Unicode的JSON字符串,再去除首尾引号 $encodedStr = trim(json_encode($searchStr, JSON_UNESCAPED_UNICODE), '"'); // 使用预处理语句避免SQL注入,同时拼接模糊匹配的通配符 $stmt = $pdo->prepare("SELECT * FROM tableX WHERE (\"text\"->>'text') LIKE ?"); $stmt->execute(["%{$encodedStr}%"]);可选:使用ILIKE处理大小写差异
如果存在大小写不一致导致的匹配失败,可替换LIKE为ILIKE实现大小写不敏感匹配:SELECT * FROM tableX WHERE ("text"->>'text') ILIKE '%Αναμονή Ενημέρωσης από%';
内容的提问来源于stack exchange,提问作者Lune
相关产品推荐
相关产品推荐

