powered by simpleCommunicator - 2.0.56     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / SQLite [игнор отключен] [закрыт для гостей] / SQLite, insert, Mac, русские кодировки
10 сообщений из 10, страница 1 из 1
SQLite, insert, Mac, русские кодировки
    #35917234
Ibolit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Доброго дня.
Пытаюсь на Маке сохранить в базе данных предложение на русском языке. В базе данных получаю закорючки. По всем документациям выходит, что SQLite поддерживает UTF-8, более того, если создать sql файл в UTF-8 с содержанием
Код: plaintext
insert into sentences (sentence) values ("привет");
и в Терминале набрать .read "название_файла.sql", все работает, как надо. А из проги -- как я говорил выше, вставляются закорючки.

На всякий случай, вот кусок кода, которым я вставляю предложения в бд:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
- (int) writeToDB:(NSString *)string {
	if (!dbIsOpen) {
		[self openDatabase];
	}
    if (sentence_insert_statement == nil) {
        static char *sql = "INSERT INTO sentences (sentence, slength) VALUES(?, ?)";
        if (sqlite3_prepare_v2(db, sql, - 1 , &sentence_insert_statement, NULL) != SQLITE_OK) {
            NSLog(@"Error: failed to prepare statement with message '%s'.", sqlite3_errmsg(db));
        }
    }
	
        sqlite3_bind_text(sentence_insert_statement,  1 , [string UTF8String], - 1 , SQLITE_TRANSIENT);
	sqlite3_bind_int(sentence_insert_statement,  2 , string.length);
    int success = sqlite3_step(sentence_insert_statement);
	NSLog(@"We stepped the sqlite3");
	
    sqlite3_reset(sentence_insert_statement);
    if (success == SQLITE_DONE) {
		return sqlite3_last_insert_rowid(db);
    } 
	return  0 ;
}		

Может, кто знает, в чем дело и как с этим бороться?

Заранее спасибо.
...
Рейтинг: 0 / 0
SQLite, insert, Mac, русские кодировки
    #35918190
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
IbolitМожет, кто знает, в чем дело и как с этим бороться?Убеди свою прогу что надо работать в UTF8. Только и всего :)
Насколько ты уверен, что странная переменная "[string UTF8String]" это действительно UTF8 строка? Оно должно в памяти храниться как UTF8.
...
Рейтинг: 0 / 0
SQLite, insert, Mac, русские кодировки
    #35918329
Ibolit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
[string UTF8String] это не странная переменная. Это вызов метода UTF8String у объекта string. В Objective-C вызов метода у объекта (а точнее, отправка ему сообщения) оформляется при помощи квадратных скобок.
А суть этого метода в том, что он возвращает Сишную строку в кодировке UTF-8, т.е. массив символов, заканчивающийся NULL-ом.
...
Рейтинг: 0 / 0
SQLite, insert, Mac, русские кодировки
    #35918343
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ibolit[string UTF8String] это не странная переменная. Это вызов метода UTF8String у объекта string. В Objective-C вызов метода у объекта (а точнее, отправка ему сообщения) оформляется при помощи квадратных скобок.
А суть этого метода в том, что он возвращает Сишную строку в кодировке UTF-8, т.е. массив символов, заканчивающийся NULL-ом.ааа.... ну извините, с этим зверем (Objective-C) я пока еще ни разу не работал.
Но вообще-то, отдавать результат метода в bind это чревато. Метод UTF8String вызывается в момент когда делается привязка (sqlite3_bind_text()) В этот момент времени результат метода действительно будет содержать то что просили.
Но привязка переменных это вещь размазанная по времени. Данные по этому указателю будут использованы намного позднее, (во время sqlite3_step). Насколько ты уверен что между bind() и отдельными step() метод [string UTF8String] будет возвращать указатель на один и тот же кусок памяти? В какой момент библиотека делает конвертацию string из своего внутреннего формата в zero-terminated UTF8?
...
Рейтинг: 0 / 0
SQLite, insert, Mac, русские кодировки
    #35918397
Ibolit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Да дело в том, что я пытался и сначала это дело присваивать переменной, а потом отправлять ее в bind.

Код: plaintext
1.
2.
const char *cString = [string UTF8String];
sqlite3_bind_text(sentence_insert_statement,  1 , cString, - 1 , SQLITE_TRANSIENT);

И тот же самый результат.
...
Рейтинг: 0 / 0
SQLite, insert, Mac, русские кодировки
    #35918432
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
IbolitДа дело в том, что я пытался и сначала это дело присваивать переменной, а потом отправлять ее в bind.

Код: plaintext
1.
2.
const char *cString = [string UTF8String];
sqlite3_bind_text(sentence_insert_statement,  1 , cString, - 1 , SQLITE_TRANSIENT);

И тот же самый результат.Ну это тоже самое что и прямое использование метода в bind.
Попробуй в этом варианте скидывать тексты по указателю cString и [string UTF8String] в лог между bind() и каждым step(). Увидишь что происходит...
Bind() можно делать только на неперемещаемый кусок памяти.
В конце-концов тебе очень надо делать привязку? Намного проще и надежнее формировать sql команду без параметров и запускать ее напрямую. Привязка нужна только если ты делаешь множество вызовов одной и той-же команды.
...
Рейтинг: 0 / 0
SQLite, insert, Mac, русские кодировки
    #35918709
Ibolit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Как оказалось, ошибка была в другой части кода. Все на самом деле вставляется правильно.
...
Рейтинг: 0 / 0
SQLite, insert, Mac, русские кодировки
    #35919004
Фотография Dmitry Arefiev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White OwlДанные по этому указателю будут использованы намного позднее, (во время sqlite3_step). Насколько ты уверен что между bind() и отдельными step() метод [string UTF8String] будет возвращать указатель на один и тот же кусок памяти?
sqlite3_bind_text(... SQLITE_TRANSIENT )
т.е. в момент вызова склайтом будет создана копия строки.
...
Рейтинг: 0 / 0
SQLite, insert, Mac, русские кодировки
    #35920761
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dmitry ArefievWhite OwlДанные по этому указателю будут использованы намного позднее, (во время sqlite3_step). Насколько ты уверен что между bind() и отдельными step() метод [string UTF8String] будет возвращать указатель на один и тот же кусок памяти?
sqlite3_bind_text(... SQLITE_TRANSIENT )
т.е. в момент вызова склайтом будет создана копия строки.Да, действительно. Я сам всегда использую SQLITE_STATIC, даже не подумал посмотреть на последний параметр... Вот ведь.
А кстати, зачем этот SQLITE_TRANSIENT вообще придуман? Какой смысл делать копию подставляемой переменной? Ее же потом подставлять нельзя, весь смысл привязки теряется.
...
Рейтинг: 0 / 0
SQLite, insert, Mac, русские кодировки
    #35921240
Фотография Dmitry Arefiev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White OwlА кстати, зачем этот SQLITE_TRANSIENT вообще придуман? Какой смысл делать копию подставляемой переменной?
Не всегда есть возможность/желание/и т.д. иметь выделенный буфер со сроком жизни
как у препарированной команды. Вот тогда и нужен SQLITE_TRANSIENT.
White OwlЕе же потом подставлять нельзя, весь смысл привязки теряется.
Смысл не теряется - команда не требует повторного разбора. А для повторной передачи
значения необходимо вызвать sqlite3_bind_text с другим значением.
...
Рейтинг: 0 / 0
10 сообщений из 10, страница 1 из 1
Форумы / SQLite [игнор отключен] [закрыт для гостей] / SQLite, insert, Mac, русские кодировки
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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