You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 01:13:19