【问题标题】:Mariadb query utf8 escaped stringMariadb 查询 utf8 转义字符串
【发布时间】:2020-12-24 07:59:42
【问题描述】:

我正在使用 5.5.65-MariaDB MariaDB 服务器。

我有一个表,其中包含一个名为“remoteData”的中等文本类型的列,其中存储了一个 json 字符串。 此 json 字符串中的字符串值存储为转义的 utf8 序列,例如

"patientFirstName":"\u0395\u039b\u0395\u03a5\u0398\u0395\u03a1\u0399\u039f\u03a3"

上面的值是希腊名字“ΕΛΕΥΘΕΡΙΟΣ”。

我正在尝试使用查询搜索此列

Select * from sync_details where remoteData like "%ΛΕΥΘΕΡ%"

但我得到了一个空集。

我认为这是因为值被转义但我不知道该怎么做。

编辑:查询将通过 php 运行,因此我们可以使用包含 php 函数的解决方案。

提前谢谢你。

克里斯托弗罗斯

【问题讨论】:

  • 允许所有你可以使用的字符集utf8mb4
  • 在数据库连接中和作为sync_detauls表中remoteData的数据类型。
  • 为表定义的字符集是什么?我要了解的是数据库是否保存以六个字符序列“\u0395”开头的 ASCII 序列,或者是否将其作为单个 utf8 字符写入数据库。您用于连接的字符集是什么?
  • @symcbean 字符集是 utf8_general_ci。它可以毫无问题地用于许多其他表。正如我提到的,这里的区别是存储的数据已经是 \u0395 的形式
  • @aRvi 我使用 utf8_general_ci,其中包含我使用的英语和希腊语的所有字符。这不是问题。

标签: mysql utf-8 mariadb


【解决方案1】:

将数据库定义为使用 CHARACTER SET utf8utf8_general_ci 排序规则,它应该像这样工作:

CREATE DATABASE IF NOT EXISTS `test` CHARACTER SET utf8 COLLATE utf8_general_ci;
CREATE TABLE `test`.`sync_details` (`remoteData` MEDIUMTEXT);
INSERT INTO `test`.`sync_details` (`remoteData`) VALUES ('{"patientFirstName":"\\u0395\\u039b\\u0395\\u03a5\\u0398\\u0395\\u03a1\\u0399\\u039f\\u03a3"}');
SELECT `remoteData` FROM `test`.`sync_details` WHERE `remoteData` LIKE '%ΛΕΥΘΕΡ%';
+----------------------------------------------+
| remoteData                                   |
+----------------------------------------------+
| {"patientFirstName": "ΕΛΕΥΘΕΡΙΟΣ"}           |
+----------------------------------------------+
1 row in set (0,00 sec)

您也可以尝试JSON_EXTRACT 从存储的 JSON 对象中获取结构化数据。我只是这样测试它:

SELECT JSON_EXTRACT(`remoteData`, "$.patientFirstName") 
FROM `test`.`sync_details` 
WHERE JSON_EXTRACT(`remoteData`, "$.patientFirstName") 
LIKE '%ΛΕΥΘΕΡ%';
+--------------------------------------------------+
| JSON_EXTRACT(`remoteData`, "$.patientFirstName") |
+--------------------------------------------------+
| "ΕΛΕΥΘΕΡΙΟΣ"                                     |
+--------------------------------------------------+
1 row in set (0,00 sec)

要索引 JSON 对象中的数据,您可以使用 GENERATED ALWAYS 语法向表中添加“生成的列”

ALTER TABLE `test`.`sync_details` ADD COLUMN `firstName` VARCHAR(100) GENERATED ALWAYS AS (`remoteData` ->> '$.patientFirstName');
CREATE INDEX `firstnames_idx` ON `test`.`sync_details`(`firstName`);
SELECT `firstName` FROM `test`.`sync_details` WHERE `firstName` LIKE '%ΛΕΥΘΕΡ%';
+----------------------+
| firstName            |
+----------------------+
| ΕΛΕΥΘΕΡΙΟΣ           |
+----------------------+
1 row in set (0,00 sec)

这仅适用于 MariaDB >= 10.2 以及 utf8 编码的数据库和 utf8_general_ci 排序规则。

【讨论】:

  • 我得到 JSON_EXTRACT 不存在
  • 好的,在 MariaDB 10.2.3 中添加了 JSON 函数。有机会升级mariadb吗?此外,MariaDB 5.5 自 2020 年 4 月起停产。
  • 我看看能不能升级。但是该表有大约 150000 行并且还在上升。这种方式需要很长时间。我想创建一个全文搜索索引来进行一些优化。您的查询在 where 子句上使用函数,并将忽略任何索引。
猜你喜欢
  • 2011-07-01
  • 2015-11-05
  • 2016-07-03
  • 1970-01-01
  • 1970-01-01
  • 2013-06-12
  • 1970-01-01
  • 2014-01-29
  • 2022-01-19
相关资源
最近更新 更多