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

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

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

Ответить
Insaned
незнакомец
Сообщения: 9
Зарегистрирован: 05.08.2009 13:46:22

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

Сообщение Insaned »

Пишу логи в базу 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'
Аватара пользователя
Снег Север
долгожитель
Сообщения: 3067
Зарегистрирован: 27.11.2007 15:14:47
Контактная информация:

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

Сообщение Снег Север »

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

http://www.mysql.ru/docs/man/String_syntax.html
Аватара пользователя
DYUMON
постоялец
Сообщения: 234
Зарегистрирован: 11.03.2009 12:32:54
Контактная информация:

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

Сообщение DYUMON »

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

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

Сообщение Insaned »

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

Да может и проще и я сейчас об этом думаю (триггер например на вставку повесить), но не хочется трогать сервер который уже давно работает и со своими задачами до сегодняшнего дня справлялся.
Аватара пользователя
Снег Север
долгожитель
Сообщения: 3067
Зарегистрирован: 27.11.2007 15:14:47
Контактная информация:

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

Сообщение Снег Север »

Insaned, что вы хотите? У вас в вашем примере стоит в тексте \0 - это нулевой символ, который в паскале - конец строки. Вот вам и обрезает строки до первого \0, как по документации и положено.
Insaned
незнакомец
Сообщения: 9
Зарегистрирован: 05.08.2009 13:46:22

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

Сообщение Insaned »

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

Хочу экранировать спецсимвол на стороне клиента.
Аватара пользователя
Снег Север
долгожитель
Сообщения: 3067
Зарегистрирован: 27.11.2007 15:14:47
Контактная информация:

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

Сообщение Снег Север »

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

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

Сообщение Insaned »

В итоге сделал так. Не уверен что это хорошее решение, но ничего не придумал.
На стороне сервера:

Код: Выделить всё

delimiter |
create trigger replace_data
before insert on logs
for each row
begin
SET NEW.msg = replace(NEW.msg,'\011',' ');
end;
|
delimiter ;
Аватара пользователя
Снег Север
долгожитель
Сообщения: 3067
Зарегистрирован: 27.11.2007 15:14:47
Контактная информация:

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

Сообщение Снег Север »

А почему не

Код: Выделить всё

SET NEW.msg = replace(NEW.msg,'\011','\\011');
?
Вы же теряете часть вашей записи так, как у вас. А вам надо экранировать слэш.
Ответить