SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 15.01.2021 20:39:57

gerzog1995
Участник
Зарегистрирован: 15.01.2021
Сообщений: 2

Поиск LIKE в JSON строке (Русские буквы)

Здравтвуйте!
Вот запрос:

SELECT *, UNCOMPRESS(s_json) FROM data WHERE UNCOMPRESS(s_json)  LIKE  '%Всем привет%'

UNCOMPRESS(s_json)- содержит обычный json, где русские символы представлены вот так примерно - "\u0412\u0412\u0412\u0412"
Пробовал в LIKE запихнуть сам "\u0412\u0412\u0412\u0412"  - безрезультатно.
Версия mysql 5.6, перейти на 8 версию нет возможности (Чтобы использовать JSON конструкции)
Какие есть идеи господа?

Неактивен

 

#2 18.01.2021 12:03:17

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6756

Re: Поиск LIKE в JSON строке (Русские буквы)

Здравствуйте!

По хорошему нужно посмотреть на вывод

SHOW CREATE TABLE data
и
SHOW VARIABLES LIKE '%char%'
.

Дальше спекулирую, но могу и угадать smile

Насколько я понимаю, s_json — это просто строка, но вы зачем-то ее сжимаете через COMPRESS.
Из-за этого теряется метаинформация о кодировке строки, и поэтому LIKE не работает. Если структура
таблицы и соединения при этом содержат правильную метаинформацию, то схема всё равно должна
работать нормально. Я сделал вот такой простой тест:

CREATE TABLE foo (a VARCHAR(10));

INSERT INTO foo VALUES ('привет');

SHOW CREATE TABLE foo;
-- CREATE TABLE `foo` (
--  `a` varchar(10) DEFAULT NULL
-- ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

CREATE TABLE bar SELECT COMPRESS(a) as a FROM foo;

SHOW CREATE TABLE bar;
-- CREATE TABLE `bar` (
--  `a` varbinary(48) DEFAULT NULL
-- ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

SELECT * FROM bar WHERE UNCOMPRESS(a) LIKE '%иве%';
-- строку нашло


Соответственно, ad-hoc-решение — просто убедиться, что кодировки снаружи расставлены верно.
Менее ad-hoc, но более правильное с моей точки зрения решение — избавиться от UNCOMPRESS
совсем, а строки хранить прямо в виде строк. Так и строки будут храниться без потери информации
о кодировках, и не нужно будет делать дважды UNCOMPRESS для такого вида запросов. Если при
этом есть переживание про размер данных, то лучше воспользоваться встроенным механизмом
сжатия InnoDB (
ALTER TABLE data KEY_BLOCK_SIZE=8
), подозреваю, что он будет даже более
эффективным, т.к. будет сжимать блоки, а не отдельные строки.

Неактивен

 

#3 18.01.2021 16:49:01

gerzog1995
Участник
Зарегистрирован: 15.01.2021
Сообщений: 2

Re: Поиск LIKE в JSON строке (Русские буквы)

Спасибо большое за ответ, решил это не совсем удачным способом. При сохранении на стороне php в mysql использовал флаг JSON_UNESCAPED_UNICODE в json_encode(), если там встречаются русские символы. Попробую ваш вариант, но uncompress() к сожалению в этом проекте слишком много где используется  и завязан под большое количество скриптов sad

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson