powered by simpleCommunicator - 2.0.38     © 2025 Programmizd 02
Форумы / SQLite [игнор отключен] [закрыт для гостей] / размер данных в поле типа TEXT
26 сообщений из 26, показаны все 2 страниц
размер данных в поле типа TEXT
    #37799335
Arm79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Здравствуйте

Создал таблицу для записи писем с почты
CREATE TABLE `RawMails`
(
rawmail_id TEXT NOT NULL,
rawmail_moment TEXT NOT NULL,
rawmail_content TEXT NOT NULL,
PRIMARY KEY(rawmail_id)
)

Я считал, прочтя обзор SQLite, что ограничений на размер нет. Но столкнулся с неприятным ограничением: при превышении чуть более 43 кбайт данные в поле rawmail_content не пишутся вообще.

C чем может быть это связано?

версия 1.0.80.0 по Net
...
Рейтинг: 0 / 0
размер данных в поле типа TEXT
    #37799446
pit_alex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Arm79,

а чем пишете?
кроме того есть директива -DSQLITE_MAX_LENGTH в которой можно указать размер таких данных, по умолчанию она равна 1,000,000,000
...
Рейтинг: 0 / 0
размер данных в поле типа TEXT
    #37799474
Arm79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да я использую Net версию и пытаюсь сейчас сообразить, как можно в ней поиграться с параметрами SQLITE_MAX_SQL_LENGTH, SQLITE_LIMIT_LENGTH, SQLITE_LIMIT_SQL_LENGTH

DSQLITE_MAX_LENGTH - по умолчанию лимон. Ну так у меня сильно меньше.


Вот, кстати, исходники:

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
if (mail.Uidl == "AAwoog6AAAg3IPZCNqr7CyUVnktCyInF")
            {
                mail.Content = Convert
                                .ToBase64String(File.ReadAllBytes(@"C:\Users\Arm79\Documents\Книги\Программирование\C#\C# 2 in depth (english).pdf"))
                                .Substring(0, 43008); // с этим значением еще пишется в БД
            }

            var _csb = new SQLiteConnectionStringBuilder()
                           {
                               DataSource = @"C:\Users\Arm79\db.db",
                               PageSize = 32768,
                               MaxPageCount = int.MaxValue
                           };
            
            using (var _con = new SQLiteConnection(_csb.ConnectionString) )
            {
                _con.Open();
                try
                {
                    using (var _cmd = new SQLiteCommand(_con) { CommandType = CommandType.Text, CommandText = "insert into [RawMails] ([rawmail_id], [rawmail_moment], [rawmail_content]) values (@rawmail_id, @rawmail_moment, @rawmail_content)"})
                    {
                        _cmd.Parameters.AddRange(
                            new SQLiteParameter[]
                                {
                                    new SQLiteParameter("@rawmail_id", DbType.String, 100) {Value = mail.Uidl}, 
                                    new SQLiteParameter("@rawmail_moment", DbType.DateTime) {Value = mail.Received},
                                    new SQLiteParameter("@rawmail_content", DbType.String, 504857600) {Value = mail.Content}
                                });

                        _cmd.ExecuteNonQuery();
                    }
                }
                finally
                {
                    _con.Close();
                }
            }






PS Вообще в первый раз работаю с SQLite, поэтому многие очевидные опытным товарищам вещи просто не знаю.
...
Рейтинг: 0 / 0
размер данных в поле типа TEXT
    #37799520
pit_alex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Arm79,

с этими параметрами (директивами) поиграться получиться при сборке библиотеки SQLite
Arm79DSQLITE_MAX_LENGTH - по умолчанию лимон чуть больше :-) The default value of this macro is 1 billion

в Net не работал, но могу предположить что DbType.String все таки имеет ограничение по размеру явно меньшее чем то что позволяет SQLite
...
Рейтинг: 0 / 0
размер данных в поле типа TEXT
    #37799585
Arm79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
pit_alexArm79,

с этими параметрами (директивами) поиграться получиться при сборке библиотеки SQLite
Arm79DSQLITE_MAX_LENGTH - по умолчанию лимон чуть больше :-) The default value of this macro is 1 billion

в Net не работал, но могу предположить что DbType.String все таки имеет ограничение по размеру явно меньшее чем то что позволяет SQLite

Увы, DbType.String - это тип данных строка Unicode, размер которой задается следующим параметром
...
Рейтинг: 0 / 0
размер данных в поле типа TEXT
    #37799725
pit_alex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Arm79,

а что то типа dbType.Text нету?
...
Рейтинг: 0 / 0
размер данных в поле типа TEXT
    #37799727
pit_alex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Arm79,

и откуда (чей) SQLiteConnection?
...
Рейтинг: 0 / 0
размер данных в поле типа TEXT
    #37799985
Stupid_BOT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
> Arm79
Код: vbnet
1.
new SQLiteParameter("@rawmail_content", DbType.String, 504857600) {Value = mail.Content}


> Увы, DbType.String - это тип данных строка Unicode, размер которой задается следующим параметром

Зачем СТОЛЬКО ?
...
Рейтинг: 0 / 0
размер данных в поле типа TEXT
    #37800147
Arm79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
pit_alexArm79,

а что то типа dbType.Text нету?

Нету
...
Рейтинг: 0 / 0
размер данных в поле типа TEXT
    #37800152
Arm79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
pit_alexArm79,

и откуда (чей) SQLiteConnection?

Штатный провайдер для .Net (System.Data.SQLite). Скачан с сайта производителя :-)
...
Рейтинг: 0 / 0
размер данных в поле типа TEXT
    #37800158
Arm79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Stupid_BOT> Arm79
Код: vbnet
1.
new SQLiteParameter("@rawmail_content", DbType.String, 504857600) {Value = mail.Content}



> Увы, DbType.String - это тип данных строка Unicode, размер которой задается следующим параметром

Зачем СТОЛЬКО ?

Для очистки совести.

По умолчанию, если в .Net не указать размер типа данных Строка, окружение считает его равным по умолчанию 8000. Что касается действительного размера писем, то это письма из системы электронного документооборота, и объем вложений достигает 15 мегабайт.
...
Рейтинг: 0 / 0
размер данных в поле типа TEXT
    #37801284
pit_alex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Arm79,

как я уже говорил, я от NET далек, но думаю этот вопрос стоит задать разработчикам System.Data.SQLite, или попробовать использовать что нибудь стороннее, у Devart есть ADO .NET провайдер под SQLite
...
Рейтинг: 0 / 0
размер данных в поле типа TEXT
    #37801303
Arm79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
pit_alexArm79,

как я уже говорил, я от NET далек, но думаю этот вопрос стоит задать разработчикам System.Data.SQLite, или попробовать использовать что нибудь стороннее, у Devart есть ADO .NET провайдер под SQLite

Да, спасибо за помощь, смотрю исходники провайдера

А сторонние - платные, не очень интересно использовать при наличии иных бесплатных альтернатив. Если не пойму, в чем проблема, перейду на SQL Compact
...
Рейтинг: 0 / 0
размер данных в поле типа TEXT
    #37801423
pit_alex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Arm79,

сдается мне что дело не в Lite и даже не в провайдере потому как вот такой код вставляет в базу строку размером 500000 символов

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
            
            String s = "";
            for (int i = 0; i < 500000; i++)
            {
                s += "a";
            }
            cmd.Parameters.AddRange(new SQLiteParameter[]
                                {
                                    new SQLiteParameter("@par1", DbType.Int32, 10) {Value = 1}, 
                                    new SQLiteParameter("@par2", DbType.String, 504857600) {Value = s}
                                });
            cmd.ExecuteNonQuery();



может глючит получение тела письма в mail.Content?
...
Рейтинг: 0 / 0
размер данных в поле типа TEXT
    #37801428
pit_alex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
pit_alex,

в поле TEXT
...
Рейтинг: 0 / 0
размер данных в поле типа TEXT
    #37801492
Arm79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
pit_alexArm79,

сдается мне что дело не в Lite и даже не в провайдере потому как вот такой код вставляет в базу строку размером 500000 символов

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
            
            String s = "";
            for (int i = 0; i < 500000; i++)
            {
                s += "a";
            }
            cmd.Parameters.AddRange(new SQLiteParameter[]
                                {
                                    new SQLiteParameter("@par1", DbType.Int32, 10) {Value = 1}, 
                                    new SQLiteParameter("@par2", DbType.String, 504857600) {Value = s}
                                });
            cmd.ExecuteNonQuery();




может глючит получение тела письма в mail.Content?

Нет, в mail.content все данные в наличии.
Для теста я вообще использовал преобразованный к base64 файл (пример сверху)

А какую версию Провайдера вы использовали? Я скачал 1.0.80.0


PS так делать нельзя, кучу времени на перераспределение памяти потеряете:
Код: c#
1.
2.
3.
4.
5.
String s = "";
            for (int i = 0; i < 500000; i++)
            {
                s += "a";
            }



Так вполне достаточно
Код: c#
1.
string s = new string('a', 500000);
...
Рейтинг: 0 / 0
размер данных в поле типа TEXT
    #37801521
Arm79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
я брал вот эту сборку: sqlite-netFx40-binary-Win32-2010-1.0.80.0.zip

а кто-нибудь на пальцах может объяснить различие между сборками sqlite-netFx40-binary-bundle-Win32-2010-1.0.80.0.zip и sqlite-netFx40-binary-Win32-2010-1.0.80.0.zip? Что за bundle?
...
Рейтинг: 0 / 0
размер данных в поле типа TEXT
    #37801532
pit_alex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Arm79,

я качал последнюю вот отсюда 1.0.66
...
Рейтинг: 0 / 0
размер данных в поле типа TEXT
    #37801544
Arm79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
pit_alex,

Значит проблема все-таки либо в SQLite (что сомнительно), либо в реализации. Тк скачанный вами провайдер от 2010 года и под версию 3.6.23.1. Я скачивал под версию 3.7.11

В любом случае большое спасибо за потраченное на меня время и за ковыряние .Net с целью повторения тестового примера.
...
Рейтинг: 0 / 0
размер данных в поле типа TEXT
    #37801596
pit_alex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Arm79,

уже самому стало интересно, скачал версию 1.0.80.0 (инсталлятор) и строка

Код: c#
1.
string s = new string('a', 500000);



все равно вставляеться :-)
...
Рейтинг: 0 / 0
размер данных в поле типа TEXT
    #37801618
fd00ch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Arm79, как-то подозрительно 43к похожи на число
2^15 (максимум для 2-байтного целого со знаком) * 4/3 (увеличение размера данных после обработки base64)
может, в коде ошибка где-то до вставки в БД?
...
Рейтинг: 0 / 0
размер данных в поле типа TEXT
    #37801630
metos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
43K это имеенно из-за того, что в тексте есть английские и русские буквы. При кодировке в UTF-8 получаем не в 2 раза больше байтиков, а меньше.
...
Рейтинг: 0 / 0
размер данных в поле типа TEXT
    #37801637
fd00ch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
metos, не силен в C#, но, вроде, в БД летит Base64 - там только инглиш. и откуда инфа о utf-8? может, ТС исползует utf-16?))
...
Рейтинг: 0 / 0
размер данных в поле типа TEXT
    #37801651
Arm79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
завтра выложу весь сольюшн :-)
...
Рейтинг: 0 / 0
размер данных в поле типа TEXT
    #37801858
Фотография Asm64D
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
http://wincode.org/dotnet/sqlite-in-dotnet Типы данных. Одно из основных преимуществ SQLite — легкость и компактность. Однако, за это приходиться платить. В частности тем, что в нашем распоряжении всего 5 типов данных. Ниже приведен их список, и как они соотносятся с типами в .NET.
NULL -> null
INTEGER -> long (System.Int64)
REAL -> float (System.Single)
TEXT -> string (System.String)
BLOB -> byte[] (System.Byte[])

http://stackoverflow.com/questions/625029/how-do-i-store-and-retrieve-a-blob-from-sqlite
http://wladm.narod.ru/C_Sharp/sqlite.html
...
Рейтинг: 0 / 0
размер данных в поле типа TEXT
    #37802086
metos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
fd00chmetos, не силен в C#, но, вроде, в БД летит Base64 - там только инглиш. и откуда инфа о utf-8? может, ТС исползует utf-16?))
Я говорил не о размере самого SQL-запроса, а говорил именно о размере данных в поле типа TEXT.
По умолчанию sqlite форматирует все строки в UTF-8. В такой кодировке все поля типа TEXT хранятся в *.db файле.
Можно конечно изменить на UTF-16 (при создании БД), но это обычно никто не делает.
...
Рейтинг: 0 / 0
26 сообщений из 26, показаны все 2 страниц
Форумы / SQLite [игнор отключен] [закрыт для гостей] / размер данных в поле типа TEXT
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]