Отображение BLOB полей таблиц БД FireBird в QTableView Qt в Windows |
Здравствуйте, гость ( Вход | Регистрация )
Отображение BLOB полей таблиц БД FireBird в QTableView Qt в Windows |
Steklova Olga |
14.3.2012, 13:59
Сообщение
#1
|
Участник Группа: Участник Сообщений: 198 Регистрация: 27.9.2011 Из: Санкт-Петербург Пользователь №: 2912 Спасибо сказали: 5 раз(а) Репутация: 4 |
Здравствуйте У меня в таблице БД есть поле BLOB для хранения текста.
Вопрос 1. Почему у меня некорректно (крокозябрами) отображается русский текст из BLOB в колонке QTableView ? Вопрос 2. Как сделать, чтобы текст в колонке с BLOB не отображался весь в одну строку, а переносился ? Вопрос 3. Что делать с шириной колонки для поля BLOB ? Ограничивать ? Мои предположения: - не в той кодировке пишу данные в БД ? - не везде, где надо, правильно указала кодировку ? - мне необходимо создать делегат, чтобы в каждой ячейке QTableView колонки с BLOB был виджет QTextEdit ? (Сейчас никакого делегата для этого QTableView у меня нет.) Делаю так: в скриптах при создании БД:
В IBExpert при регистрации БД указываю: - Charset = WIN1251 - оставляю не включенным (как по умолчанию и есть) флаг Do NOT perform conversion from/to UTF8 - Font Characters Set = RUSSIAN_CHARSET При этом в IBExpert данные поля BLOB таблицы отображаются корректно, как и при включенном флаге (не совсем понимаю, что делает этот флаг). в main.cpp:
в mainwindow_db.cpp (в главном окне):
в mainwindow_db.h:
|
|
|
Алексей1153 |
14.3.2012, 14:30
Сообщение
#2
|
фрилансер Группа: Участник Сообщений: 2941 Регистрация: 19.6.2010 Из: Обливион Пользователь №: 1822 Спасибо сказали: 215 раз(а) Репутация: 34 |
1 - полагаю, блобу абсолютно пофиг на кодировку - это поток байтов. Как вытаскиваешь данные для записи в блоб, так нужно и обратно заталкивать (к примеру, через посредника std::string - у QString есть метод для получения такого объекта. )
Возможно, нужно применить другой тип поля - VARCHAR или что там 2 - опять же, производится, скорее всего, попытка отобразить байтовый поток в виде строки. И это прекрасно удаётся . Выход - только ручками как-то выводить так, как нужно, разбавляя переносами строки 3 - 2 Сообщение отредактировал Алексей1153 - 14.3.2012, 14:31 |
|
|
Steklova Olga |
14.3.2012, 14:44
Сообщение
#3
|
Участник Группа: Участник Сообщений: 198 Регистрация: 27.9.2011 Из: Санкт-Петербург Пользователь №: 2912 Спасибо сказали: 5 раз(а) Репутация: 4 |
Цитата(Алексей1153) Возможно, нужно применить другой тип поля - VARCHAR В этой таблице у этого поля мне нужен тип BLOB с текстом, а не VARCHAR, потому что заранее совершенно неизвестно количество символов.Цитата Как вытаскиваешь данные для записи в блоб, так нужно и обратно заталкивать (к примеру, через посредника std::string - у QString есть метод для получения такого объекта. не понялаВ том, что у меня сейчас сделано, насколько я понимаю, везде указана одна и та же кодировка - WIN1251. Сообщение отредактировал Steklova Olga - 14.3.2012, 15:51 |
|
|
Алексей1153 |
14.3.2012, 20:01
Сообщение
#4
|
|
фрилансер Группа: Участник Сообщений: 2941 Регистрация: 19.6.2010 Из: Обливион Пользователь №: 1822 Спасибо сказали: 215 раз(а) Репутация: 34 |
Оля, ты, судя по всему, используешь Огнептицу
я попробовал у себя в эксперте - сделал такую же таблицу, выполнил вставку. Штатный просмотрщик блоба говорит, что всё видно. Видимо дело у тебя в кодировке текста скрипта - ты как его выполняешь ? В коде программы ? И повторюсь - у блоба нет понятия кодировки, там тупо байты. Вот таким образом, как ты делаешь вставку, я никогда не делал (хотя это сработало - скрин). Я вставлял маркер "?", а только потом данные в виде бинарного массива. Но в моём случае было WinAPI. Как тут это провернуть - я не в курсе Сообщение отредактировал Алексей1153 - 14.3.2012, 20:03 |
|
|
||
Tonal |
15.3.2012, 8:15
Сообщение
#5
|
Активный участник Группа: Участник Сообщений: 452 Регистрация: 6.12.2007 Из: Новосибирск Пользователь №: 34 Спасибо сказали: 69 раз(а) Репутация: 17 |
И повторюсь - у блоба нет понятия кодировки, там тупо байты. Вот таким образом, как ты делаешь вставку, я никогда не делал (хотя это сработало - скрин). Я вставлял маркер "?", а только потом данные в виде бинарного массива. Но в моём случае было WinAPI. Как тут это провернуть - я не в курсе Тут ты не совсем прав. В Firebird-е при создании блоба указывается его подтип. Ежели подтип блоба TEXT, то его кодировка так же может быть указана явно либо взята дефолтная. Раньше, кодировки установленные для блобов игнорировались, но начиная с версии 2.1 сервер работает с блобами в этом отношении так же как и с остальными текстовыми типами. Соответственно, при работе с текстовыми блобами в птичке нужно учитывать версию сервера. П. С. Судя по скриншоту, ты используешь виндовый IBExpert. Насколько я в курсе, это один из самых совершенных просмотрщиков для птички, и проблемам кодировок в нём постоянно уделяется довольно много времени. Так что не все результаты «влёгкую» полученные на нём можно просто воспроизвести на каком-либо другом продукте или в коде. Например если в русском сообществе разработчиков птицы при описании какого-нибудь эффекта/бага сервера ты используешь IBE, тебе, скорее всего, настоятельно порекомендуют повторить его на штатном консольном клиенте. Сообщение отредактировал Tonal - 15.3.2012, 8:34 |
|
|
Алексей1153 |
15.3.2012, 9:33
Сообщение
#6
|
фрилансер Группа: Участник Сообщений: 2941 Регистрация: 19.6.2010 Из: Обливион Пользователь №: 1822 Спасибо сказали: 215 раз(а) Репутация: 34 |
Tonal, возможно
|
|
|
Steklova Olga |
15.3.2012, 11:33
Сообщение
#7
|
Участник Группа: Участник Сообщений: 198 Регистрация: 27.9.2011 Из: Санкт-Петербург Пользователь №: 2912 Спасибо сказали: 5 раз(а) Репутация: 4 |
1. Использую FireBird 2.1 в Windows.
2. У меня тоже в IBExpert данные поля BLOB таблицы отображаются корректно. 3. Цитата(Tonal) В Firebird-е при создании блоба указывается его подтип. Ежели подтип блоба TEXT, то его кодировка так же может быть указана явно либо взята дефолтная Я указываю и подтип TEXT, и кодировку блоба. 4. Цитата(Алексей1153) Видимо дело у тебя в кодировке текста скрипта - ты как его выполняешь ? В коде программы ? Для начала, я попробовала вставить в таблицу T_MSG записи с BLOB с помощью скрипта вставки данных. В первом сообщении я привела тексты скриптов создания БД, доменов, таблицы и вставки данных. Тексты скриптов набирала в IBExpert. Еще есть общий скрипт, который я выполнила в IBExpert (Tools | Script Executive):
5. На самом деле, мне надо будет вставлять в таблицу T_MSG записи с BLOB в коде программы с помощью QSqlQuery "INSERT INTO T_MSG ..." Данные для очередной записи таблицы поступают ко мне в виде структуры:
|
|
|
Steklova Olga |
15.3.2012, 15:13
Сообщение
#8
|
Участник Группа: Участник Сообщений: 198 Регистрация: 27.9.2011 Из: Санкт-Петербург Пользователь №: 2912 Спасибо сказали: 5 раз(а) Репутация: 4 |
6. Для теста изменила структуру таблицы T_MSG и ее заполнение, использовала другие домены:
7. Вставила в таблицу T_MSG записи (с номерами 3 и 4) с BLOB в коде программы с помощью QSqlQuery:
В результате в QTableView: во всех записях (с номерами 1-4) в поле F_MSG_TEXT_VC русский есть, в поле F_MSG_TEXT_B русского нет. Посмотрела данные таблицы T_MSG в IBExpert: во всех записях (с номерами 1-4) в полях F_MSG_TEXT_VC и F_MSG_TEXT_B русский есть. Сообщение отредактировал Steklova Olga - 15.3.2012, 15:49 |
|
|
Steklova Olga |
15.3.2012, 15:58
Сообщение
#9
|
Участник Группа: Участник Сообщений: 198 Регистрация: 27.9.2011 Из: Санкт-Петербург Пользователь №: 2912 Спасибо сказали: 5 раз(а) Репутация: 4 |
8. Если оставить все как есть, но попробовать поменять кодировку блоба:
то результат такой же, как в пункте 7. 9. В пункте 4., при выполнении общего скрипта в IBExpert (Tools | Script Executive) из вариантов Execute charset: (ANSI, UTF8, Ask me) выбран вариант по умолчанию (ANSI). 10. А в IBExpert при регистрации БД в каком случае надо включать флаг "Do NOT perform conversion from/to UTF8" ? Сообщение отредактировал Steklova Olga - 15.3.2012, 17:55 |
|
|
Steklova Olga |
15.3.2012, 18:51
Сообщение
#10
|
Участник Группа: Участник Сообщений: 198 Регистрация: 27.9.2011 Из: Санкт-Петербург Пользователь №: 2912 Спасибо сказали: 5 раз(а) Репутация: 4 |
11. Кстати, Алексей1153, если в IBExpert открыть таблицу T_MSG, а для нее страницу Data,
то у вас в поле F_MSG_TEXT отображается иконка, а у меня вместо нее - начальные символы текста блоба, а в hint'е - полный текст блоба. И еще. Кроме вариантов просмотра блоба As Text, As Hex, As Picture, As RTF, As Web Page, которые есть у вас, у меня еще есть варианты As XML и As Unicode Text. Это связано с тем, что у нас разные версии IBExpert? 12. Открыла в IBExpert таблицу T_MSG. Нажала кнопку Export Data into Script. Отметила поле F_MSG_TEXT_B, чтобы его данные тоже записались в скрипт. Выбрала имя файла 1.sql. Нажала кнопку Export. Получила два файла: 1.sql и 1.lob. в файле 1.sql: в файле 1.lob: Смотрела файл 1.lob в Notepad++. Он говорит, что файл - в кодировке ANSI. Выглядит по-русски.":h0000000E_0000000C" означает, что данные блоба для второй записи располагаются в файле 1.lob, начиная с адреса 0000000E и занимают 0000000C байтов ? 13. Конкретно эту Qt-шную программу я не планирую переводить на другой язык (англ), поэтому unicode вроде-бы мне не нужен. Я собиралась использовать БД в WIN1251. Эксперименты продолжаются. BLOB не сдается, вредина. Но очень хотелось бы все-таки с ним разобраться! Сообщение отредактировал Steklova Olga - 15.3.2012, 18:57 |
|
|
Текстовая версия | Сейчас: 28.11.2024, 12:56 |