我的SQL表中有一个json列,我正在使用LIKE%在其中搜索值,它可以很好地处理英文字符,但在搜索希腊字符时,它会中断,因为希腊字符是在表中编码的,但是在应用LIKE语句之前,我try 使用json_encode(PHP)对其进行编码,但仍然失败 下面是它在数据库中的存储方式

{"text":"\u0391\u03bd\u03b1\u03bc\u03bf\u03bd\u03ae \u0395\u03bd\u03b7\u03bc\u03ad\u03c1\u03c9\u03c3\u03b7\u03c2 \u03b1\u03c0\u03cc"}

这是应用的查询

select * from tableX where ("text"::text like '%\u0391\u03bd\u03b1\u03bc\u03bf\u03bd\u03ae \u0395\u03bd\u03b7\u03bc\u03ad\u03c1\u03c9\u03c3\u03b7\u03c2 \u03b1\u03c0\u03cc%')

我是不是错过了什么? 我使用的是PostgreSQL

推荐答案

try 使用实际的希腊文本,而不是转义序列.就像PHP、Python、C++、JavaScript、Java、C#一样,您在源代码中使用的转义序列或在调试器中看到的转义序列并不会真正出现在字符串中.编译器将它们替换为实际的字符.同样的情况也发生在JSON反序列化程序中.

这意味着

{"text":"\u0391\u03bd\u03b1\u03bc\u03bf\u03bd\u03ae \u0395\u03bd\u03b7\u03bc\u03ad\u03c1\u03c9\u03c3\u03b7\u03c2 \u03b1\u03c0\u03cc"}

等同于

{"text":"Αναμονή Ενημέρωσης από"}

try

select * from tableX where text->>'text' like '%Αναμονή%' 

JSON字符串是Unicode,所以没有理由使用转义序列.当使用转义序列时,解析器会用实际字符替换它们.


作为参考,从RFC8259: The JavaScript Object Notation (JSON) Data Interchange Format

Strings section强中

      string = quotation-mark *char quotation-mark

      char = unescaped /
          escape (
              %x22 /          ; "    quotation mark  U+0022
              %x5C /          ; \    reverse solidus U+005C
              %x2F /          ; /    solidus         U+002F
              %x62 /          ; b    backspace       U+0008
              %x66 /          ; f    form feed       U+000C
              %x6E /          ; n    line feed       U+000A
              %x72 /          ; r    carriage return U+000D
              %x74 /          ; t    tab             U+0009
              %x75 4HEXDIG )  ; uXXXX                U+XXXX

      escape = %x5C              ; \

      quotation-mark = %x22      ; "

      unescaped = %x20-21 / %x23-5B / %x5D-10FFFF

这意味着除8 can以外的所有Unicode字符都显示为未转义.

8.1 Character Encoding

在不属于关闭的系统的系统之间交换的JSON文本 生态系统必须使用UTF-8编码

Sql相关问答推荐

SQL计数所有值在联接范围内的行

Select 最大值,但当并列时,从其他列 Select 最大值

SQL将 Select 查询作为新列添加到另一个 Select 查询

如何根据给定条件PostgreSQL迭代减少组中的行数

雅典娜嵌套Json提取液

SQL计数条目大于日期,包括交叉表中的零

在SQL Server中设置关联对象的有效JSON格式

用于从第二个表中提取具有最小最终价格值的记录的SQL查询

在SQL中,筛选其他列中只有一个值的ID

SQL仅返回第一个字母在A-Z之间的值

配置单元查询失败:无法识别';附近的输入;LEFT'';(select子句中的';';col'

更改重复值的情况

Athena 计算从日期到当前时间戳的每月计数

Select 组中的第一行,但在并发环境中

如何将 START 和 END 日期之间的日期差异作为 SQL 中的单独列获取

在自引用表中使用分组和计数的SQL查询语句

MariaDB非常简单的MATCHAGAINST查询不使用FULLTEXT索引吗?

BigQuery Pivot 遗漏行

我如何编写一个遍历数组数组并将所有值连接成一个字符串的 postgres 函数

查找具有相同连接列数据的所有记录