Lazarus обрезает строку при чтении из MySQL

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Lazarus обрезает строку при чтении из MySQL

Сообщение Insaned » 27.10.2020 10:12:40

Пишу логи в базу Mysql. Пытаюсь их читать из Lazarus. Столкнулся с тем что некоторые строчки Lazarus безбожно обрезает.
Выглядит это так:
Изображение

А на самом деле в базе так:
Изображение

Lazarus 2.0.10. Компоненты из стандартной библиотеки. Тип проблемного поля в базе text (пробовал varchar - не помогло). Обрезание происходит в TSQLQuery или раньше (не в компонентах визуализации). Т.е. если в редакторе запросов выполнить запрос то он отобразится уже урезанным. СУБД - изначально была MariaDB но переход на MySQL 5.7 проблему не решил.

Если выгрузить таблицу mysqldump-ом то проблемное поле в нем выглядит так:
Код: Выделить всё
'2020-10-26T21:06:41.142Z\011INFO\011piecestore\011upload started\011{\"Piece ID\": \"AXM2YT6GJVAPK6JHWW7SJT4K34IFS3TONWQNO2TUXR7X36FR23CA\", \"Satellite ID\": \"12EayRS2V1kEsWESU9QMRseFhdxYxKicsiFmxrsLZHeLUtdps3S\", \"Action\": \"PUT\", \"Available Space\": 478335599584}',8,'2020-10-27 00:07:54'
Insaned
незнакомец
 
Сообщения: 9
Зарегистрирован: 05.08.2009 13:46:22

Re: Lazarus обрезает строку при чтении из MySQL

Сообщение Снег Север » 27.10.2020 11:59:40

Перед выгрузкой пройтись по строке заменой и заменить все \ на \\. Или делать это в самом SQL-запросе. Символ \ имеет специальное значение - он вместе с символом после него рассматривается как управляющий в тексте!

http://www.mysql.ru/docs/man/String_syntax.html
Аватара пользователя
Снег Север
долгожитель
 
Сообщения: 2993
Зарегистрирован: 27.11.2007 16:14:47

Re: Lazarus обрезает строку при чтении из MySQL

Сообщение DYUMON » 27.10.2020 14:40:16

Эмм , а не проще эти логи парсить перед записью в базу, опять же для анализа последующего проще.
Аватара пользователя
DYUMON
постоялец
 
Сообщения: 234
Зарегистрирован: 11.03.2009 13:32:54

Re: Lazarus обрезает строку при чтении из MySQL

Сообщение Insaned » 27.10.2020 17:29:22

DYUMON писал(а):Эмм , а не проще эти логи парсить перед записью в базу, опять же для анализа последующего проще.

Да может и проще и я сейчас об этом думаю (триггер например на вставку повесить), но не хочется трогать сервер который уже давно работает и со своими задачами до сегодняшнего дня справлялся.
Insaned
незнакомец
 
Сообщения: 9
Зарегистрирован: 05.08.2009 13:46:22

Re: Lazarus обрезает строку при чтении из MySQL

Сообщение Снег Север » 27.10.2020 18:03:40

Insaned, что вы хотите? У вас в вашем примере стоит в тексте \0 - это нулевой символ, который в паскале - конец строки. Вот вам и обрезает строки до первого \0, как по документации и положено.
Аватара пользователя
Снег Север
долгожитель
 
Сообщения: 2993
Зарегистрирован: 27.11.2007 16:14:47

Re: Lazarus обрезает строку при чтении из MySQL

Сообщение Insaned » 27.10.2020 18:12:32

Снег Север писал(а): что вы хотите?

Хочу экранировать спецсимвол на стороне клиента.
Insaned
незнакомец
 
Сообщения: 9
Зарегистрирован: 05.08.2009 13:46:22

Re: Lazarus обрезает строку при чтении из MySQL

Сообщение Снег Север » 27.10.2020 19:00:59

Лучше всего при записи сразу заменять на двойной слэш, как я написал в первом ответе. И тогда не будет никаких проблем у клиента. Я именно так и делаю всегда. Если записываете не вы, то читать как массив байт и конвертировать в строку на клиенте.
Аватара пользователя
Снег Север
долгожитель
 
Сообщения: 2993
Зарегистрирован: 27.11.2007 16:14:47

Re: Lazarus обрезает строку при чтении из MySQL

Сообщение Insaned » 29.10.2020 11:57:58

В итоге сделал так. Не уверен что это хорошее решение, но ничего не придумал.
На стороне сервера:
Код: Выделить всё
delimiter |
create trigger replace_data
before insert on logs
for each row
begin
SET NEW.msg = replace(NEW.msg,'\011',' ');
end;
|
delimiter ;
Insaned
незнакомец
 
Сообщения: 9
Зарегистрирован: 05.08.2009 13:46:22

Re: Lazarus обрезает строку при чтении из MySQL

Сообщение Снег Север » 29.10.2020 13:19:02

А почему не
Код: Выделить всё
SET NEW.msg = replace(NEW.msg,'\011','\\011');
?
Вы же теряете часть вашей записи так, как у вас. А вам надо экранировать слэш.
Аватара пользователя
Снег Север
долгожитель
 
Сообщения: 2993
Зарегистрирован: 27.11.2007 16:14:47


Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 39

Рейтинг@Mail.ru