Было решено создать полностью уникодное приложение на Делфи 6.0
База данных была взята от MySql, версия 4.1.1 alpha.
(B manual'e mysql 4.1.1 alpha сказано что в данную
версию включили поддержку уникода).
Уникодные делфи компоненты были взяты от Tnt Software Products: http://home.ccci.org/wolbrink/tnt/delphi_unicode_controls.htm.
(Копоненты просто отличные, к тому-же freeware).
Для связи с базой данных Mysql использовался драйвер myodbc-3.51
от MySql: http://www.mysql.com/downloads/api-myodbc-3.51.html.
(Попытка заинсталировать myodbc-3.52, последнию версию драйвера,
полностью провалилась. Так как она ещё в разработке.)
Проблема заключается в том что никак не получается из
уникодных компонентов Tnt на прямую вести запись в базу данных.
При записи информация теряется, превращается в кучу вопросиков.
Где происходит потеря данных, в Mysql'е, в myodbc или же db компоненты
не то отсылают, понять не смог. Может кто встречался с подобными проблемами
или может быть кого-то интересует написания уникодных приложений
на делфи, могли бы вместе обмозговать данную задачу.
Всетаки век уникода давно настал. Пора находить практичные решения.
Было-бы очень удобно напрямую записывать и считывать уникод в базу
данных без всяких программ посредников.(Если конечно это можно
осуществить используя Mysql и уникодные компоненты Tnt.)
Спасибо за любую оказанную помощь в этом вопросе.
Megalom
Re: Запись unicoda в Mysql. Кто может помочь?
От:
Аноним
Дата:
13.02.04 12:06
Оценка:
Здравствуйте, megalom, Вы писали:
Доброго времени суток!
Дело в том, что я занимаюсь разработкой проекта с поддержкой строк в формате Юникод.
Язык разработки — Delphi 7.0. С Delphi 6.0 возникли некоторые проблемы, о которых скажу чуть позже. Для отображения данных использую компоненты Tnt.
Первоночально программа работала с СУБД Аксес. Доступ осуществлялся с использованием Microsoft Jet 4.0. Механизм доступа к БД — АДО. Проблем с Юникодом небыло и быть немогло.
Однако затем возникла необходимость в поддержке серверной СУБД.
Выбор пал на MySql. Скачали последнюю версию(4.1.1), попробовали, но не тут то было.
ОлеДб провайдер не держит строки в формате Юникод, а ОДБС действительно ещё в разработке.
Анансировано, что версия 3.52 будет поддерживать, но когда?
В результате поисков было найдено решение в использовании MSDE сервера.
Этот сервер бесплатный для разработчиков, и представляет собой немного урезанный по функциональности 2000 скл Сервер. ОлеДб провайдер держит строки в формате Юникод.
Однако возникла проблема с Делфи 6.0, а точнее с параметризированными запросами.
Короче проблема разрешилась переходом на версию 7.0.
Вот так то. Удачи.
M>Заранее спасибо за внимание.
M>Было решено создать полностью уникодное приложение на Делфи 6.0 M>База данных была взята от MySql, версия 4.1.1 alpha. M>(B manual'e mysql 4.1.1 alpha сказано что в данную M>версию включили поддержку уникода). M>Уникодные делфи компоненты были взяты от Tnt Software Products: M>http://home.ccci.org/wolbrink/tnt/delphi_unicode_controls.htm. M>(Копоненты просто отличные, к тому-же freeware). M>Для связи с базой данных Mysql использовался драйвер myodbc-3.51 M>от MySql: http://www.mysql.com/downloads/api-myodbc-3.51.html. M>(Попытка заинсталировать myodbc-3.52, последнию версию драйвера, M>полностью провалилась. Так как она ещё в разработке.)
M>Проблема заключается в том что никак не получается из M>уникодных компонентов Tnt на прямую вести запись в базу данных. M>При записи информация теряется, превращается в кучу вопросиков. M>Где происходит потеря данных, в Mysql'е, в myodbc или же db компоненты M>не то отсылают, понять не смог. Может кто встречался с подобными проблемами M>или может быть кого-то интересует написания уникодных приложений M>на делфи, могли бы вместе обмозговать данную задачу. M>Всетаки век уникода давно настал. Пора находить практичные решения. M>Было-бы очень удобно напрямую записывать и считывать уникод в базу M>данных без всяких программ посредников.(Если конечно это можно M>осуществить используя Mysql и уникодные компоненты Tnt.)
M>Спасибо за любую оказанную помощь в этом вопросе.
M>Megalom
Вы написали что с Делфи 6.0 возникли проблемы.
Всетаки я попробывал работать с Делфи 6.0
(Пока к сожалению 7.0 версии не имею.)
Установил MSDE сервер последней версии.
Для стринговых полей использовал тип данных nvarchar.
Для доступа к базе исползовал АДО компоненты.
(BDE компоненты не заработали с nvarchar типом.)
Всё прекрасно заработало. Но вы писали о проблеме
с параметризированными запросами. Не могли бы
уточнит в чём заключается проблема, возможно
мне придётся с этим столкнуться и надо будет
всё таки переходить на Делфи 7.0.
Доброго времени суток.
Все зависит от того, как Вы осуществляете добавление и модификацию данных.
Есть много способов, у меня это делалось так:
Есть скрипт для добавления данных:
sql_add_lang := 'INSERT INTO LanguageW(ID,LanguageW) VALUES(%d,''%s'');';
Затем я его парсю функцией WideFormat
и отдаю на выполнение TAdoCommand.
В Аксесе все работало прекрасно, но в МСДЕ возникли проблемы с юникодом.
После я попробовал параметризированные запросы, в результате получил следующее:
Доброго.
Всё заработало, но как вы и сказали, толко в Делфи 7.0.
Вот толко у меня тнт копоненты при билде дают кучу
варнингов, но это не проблема.
Спасибо за оказанную помощь.
Думаю решение найдено,
Те кто заинтересованы в создание уникодного приложения,
(в Делфи) по моему вполне могут использовать данный путь:
— Уникодные делфи компоненты берутся от Tnt Software Products: Здесь их можно скачать.
— Среда програмирования Делфи 7.0
— База данных MSDE, SQL Server 2000.
— Подклучение к базе ADO-ODBC
Спасибо всем за участие, и удачи в нахождении практичных решений.
P.S. Просьба к читателям, оценить данный способ,
чтобы утвердиться в практичности решения.
Здравствуйте, Dimonka, Вы писали: D>Как вариант — уникодовый текст можно сжимать в ЮТФ8 и сохранять как обычные строки, а затем разжимать снова.
Ну, скажем так, UTF8 — это в общем-то не сжатие. Это и есть unicode
... << RSDN@Home 1.1.3 beta 2 >>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Здравствуйте, Sinclair, Вы писали:
S>Здравствуйте, Dimonka, Вы писали: S>Ну, скажем так, UTF8 — это в общем-то не сжатие. Это и есть unicode
Ну в общем-то не совсем.
unicode — это WideChar, а UTF8 — это метод кодирования.
Вот оффициальный глоссарий терминов: http://www.unicode.org/glossary/
Здравствуйте, Dimonka, Вы писали: D>Ну в общем-то не совсем. D>unicode — это WideChar, а UTF8 — это метод кодирования. D>Вот официальный глоссарий терминов: D>http://www.unicode.org/glossary/
Нигде в упомянутом документе не сказано, что Unicode==WideChar. И не может быть сказано. Потому, что WideChar в Delphi — это фактически UCS-2. Unicode — это математическая абстракция, которая оперирует некими CodePoint'ами. UTF-8, как и UCS-2(aka UTF-16), суть методики представления CodePoints в бинарном виде. И ими этот набор не исчерпывается, т.к. существуют UTF-7 и UCS-4.
Я очень рекомендую к прочтению статью Спольски http://joelonsoftware.com/articles/Unicode.html на эту тему.
... << RSDN@Home 1.1.3 beta 2 >>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Здравствуйте, Sinclair, Вы писали:
S>Нигде в упомянутом документе не сказано, что Unicode==WideChar. И не может быть сказано. Потому, что WideChar в Delphi — это фактически UCS-2. Unicode — это математическая абстракция, которая оперирует некими CodePoint'ами. UTF-8, как и UCS-2(aka UTF-16), суть методики представления CodePoints в бинарном виде. И ими этот набор не исчерпывается, т.к. существуют UTF-7 и UCS-4.
Вот вырвал из контекста микрософтоской статьи:
Unicode standard on Windows NT:
Unicode is a 16-bit character encoding, providing enough encodings for all languages. All ASCII characters are included in Unicode as “widened” characters.
Я понимаю, что это тоже один из видов кодирования, но когда подразумевалось использование Unicode в Windows, мне почему-то всегда представлялся именно Windows-совский способ кодирования, потому что он используется без дополнительных трудозатрат..