У SQLite есть интересная «функция», позволяющая хранить что-либо в любом поле независимо от его типа данных.Поддержка Delphi для набора символов SQLite
http://www.sqlite.org/different.html#typing
мне приходится читать некоторые внешне созданные SQLite файлы, которые были созданы (AB), используя эту «особенность». Они имеют поле, определенное как VARCHAR (30), но используют его для хранения строк до 100 символов или более. SQLite с радостью делает это без каких-либо обрезки, если вы делаете прямые вызовы в SQLite DLL для хранения ваших данных.
В настоящее время я использую DevArt UniDAC 3.70.0.19, который имеет поддержку SQLite для чтения этих файлов, однако он довольно разумно уважает размер поля, поскольку он определен, и поэтому создает объект TStringField длиной 30 символов. Все символы, хранящиеся за пределами этого предела в 30 символов, недоступны для меня.
Я знаю обо всех доступных решениях Delphi для SQLite, однако может кто-нибудь сказать мне, кто из них, если кто-нибудь может справиться с этой «функцией»?
Это не имеет никакого смысла в sqlite.В отличие от большинства баз данных SQL, SQLite не ограничивает тип данных, которые могут быть вставлены в столбец на основе объявленного типа столбцов. Вместо этого SQLite использует динамическую типизацию. Объявленный тип столбца используется для определения близости только столбца. Например, такие трюки для подделки определения таблицы не будут работать, например, с запросами sql. –
@Arnaud_Bouchez, OP quote: «Все символы, хранящиеся за пределами этого предела в 30 символов, недоступны для меня». Этот трюк решил именно эту проблему, так как код, который анализирует sqlite-схему (единственный способ сделать ограниченную по размеру типизацию), теперь будет более чем счастлив показать все символы ниже 100 – Maksee
. В заголовке вопроса явно указано «Поддержка Delphi для набора символов SQLite », а усечение - лишь небольшая часть проблемы. Блоки SQLite3 на основе TDataSet (такие как UniDac или даже самый последний драйвер DBExpress, поставляемый с XE3) просто не смогут использовать эту функцию. Вопрос OP заключается в использовании этой функции в Delphi, а не только для исправления усечения текстового поля. Проблема не в SQLite3, а на стороне Delphi обрабатываются API-интерфейсы SQlite3 и возвращаются данные. Вот почему ваш ответ верен, но, к сожалению, выходит за рамки. –