Запись unicoda в Mysql. Кто может помочь?
От: megalom  
Дата: 13.02.04 03:55
Оценка:
Заранее спасибо за внимание.

Было решено создать полностью уникодное приложение на Делфи 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
Re[2]: Запись unicoda в Mysql. Кто может помочь?
От: megalom  
Дата: 13.02.04 21:20
Оценка:
Здравствуйте, Аноним, Вы писали:

Доброго.

Вы написали что с Делфи 6.0 возникли проблемы.
Всетаки я попробывал работать с Делфи 6.0
(Пока к сожалению 7.0 версии не имею.)
Установил MSDE сервер последней версии.
Для стринговых полей использовал тип данных nvarchar.
Для доступа к базе исползовал АДО компоненты.
(BDE компоненты не заработали с nvarchar типом.)
Всё прекрасно заработало. Но вы писали о проблеме
с параметризированными запросами. Не могли бы
уточнит в чём заключается проблема, возможно
мне придётся с этим столкнуться и надо будет
всё таки переходить на Делфи 7.0.

Заранее спасибо за ответ.

Megalom
Re[3]: Запись unicoda в Mysql. Кто может помочь?
От: bsvas  
Дата: 14.02.04 08:29
Оценка: 2 (1)
Доброго времени суток.
Все зависит от того, как Вы осуществляете добавление и модификацию данных.
Есть много способов, у меня это делалось так:
Есть скрипт для добавления данных:

  sql_add_lang := 'INSERT INTO LanguageW(ID,LanguageW) VALUES(%d,''%s'');';

Затем я его парсю функцией WideFormat
и отдаю на выполнение TAdoCommand.
В Аксесе все работало прекрасно, но в МСДЕ возникли проблемы с юникодом.
После я попробовал параметризированные запросы, в результате получил следующее:

  sql_add_lang := 'INSERT INTO LanguageW(ID,LanguageW) VALUES(?,?);';
com.Parameters.Clear;
com.CommandTest := sql_add_lang; 
com.Parameters.CreateParameter(...);
com.Parameters.CreateParameter(...);
com.Execute;

Так вот, этот код и заработал нормально с юникодом только в Delphi 7.0,
в предыдущей версии юникод записать в таблицу не удалось.

Вот так. Удачи!
[moderator]: Обоим участникам
От: Sinclair Россия https://github.com/evilguest/
Дата: 16.02.04 16:42
Оценка:
Здравствуйте, bsvas и megalom,
Настоятельно рекомендую воздержаться от избыточного цитирования. Также советую использовать раскраску синтаксиса при помощи тэгов [pascal] и [ccode]
... << RSDN@Home 1.1.3 beta 2 >>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[4]: Запись unicoda в Mysql. Кто может помочь?
От: megalom  
Дата: 17.02.04 00:46
Оценка:
Здравствуйте, bsvas, Вы писали:

Доброго.
Всё заработало, но как вы и сказали, толко в Делфи 7.0.
Вот толко у меня тнт копоненты при билде дают кучу
варнингов, но это не проблема.
Спасибо за оказанную помощь.
Re: [megalom]: Модератору
От: megalom  
Дата: 17.02.04 00:53
Оценка: :)
Здравствуйте, Sinclair, Вы писали:

Я на этом сайте недавно. Ваши правила ясны.
Буду краток.
Re: Запись unicoda в Mysql. Кто может помочь?
От: Dimonka Верблюд  
Дата: 17.02.04 11:22
Оценка: +1
Здравствуйте, megalom, Вы писали:

M>Заранее спасибо за внимание.


M>Спасибо за любую оказанную помощь в этом вопросе.


M>Megalom


Как вариант — уникодовый текст можно сжимать в ЮТФ8 и сохранять как обычные строки, а затем разжимать снова.
Re[2]: Запись unicoda в Mysql. Кто может помочь?
От: megalom  
Дата: 18.02.04 00:09
Оценка:
Здравствуйте, Dimonka, Вы писали:

D>Как вариант — уникодовый текст можно сжимать в ЮТФ8 и сохранять как обычные строки, а затем разжимать снова.


Тоже вариант. Но всё же согласитесь, приятней работать напрямую.
Re: Запись unicoda в Mysql. Кто может помочь?
От: megalom  
Дата: 18.02.04 00:43
Оценка:
Думаю решение найдено,
Те кто заинтересованы в создание уникодного приложения,
(в Делфи) по моему вполне могут использовать данный путь:

— Уникодные делфи компоненты берутся от Tnt Software Products:
Здесь их можно скачать.
— Среда програмирования Делфи 7.0
— База данных MSDE, SQL Server 2000.
— Подклучение к базе ADO-ODBC

Спасибо всем за участие, и удачи в нахождении практичных решений.

P.S. Просьба к читателям, оценить данный способ,
чтобы утвердиться в практичности решения.
Re[2]: Запись unicoda в Mysql. Кто может помочь?
От: Sinclair Россия https://github.com/evilguest/
Дата: 18.02.04 04:27
Оценка: +1
Здравствуйте, Dimonka, Вы писали:
D>Как вариант — уникодовый текст можно сжимать в ЮТФ8 и сохранять как обычные строки, а затем разжимать снова.
Ну, скажем так, UTF8 — это в общем-то не сжатие. Это и есть unicode
... << RSDN@Home 1.1.3 beta 2 >>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[3]: Запись unicoda в Mysql. Кто может помочь?
От: Dimonka Верблюд  
Дата: 18.02.04 08:41
Оценка: -1
Здравствуйте, Sinclair, Вы писали:

S>Здравствуйте, Dimonka, Вы писали:

S>Ну, скажем так, UTF8 — это в общем-то не сжатие. Это и есть unicode
Ну в общем-то не совсем.
unicode — это WideChar, а UTF8 — это метод кодирования.
Вот оффициальный глоссарий терминов:
http://www.unicode.org/glossary/
Re[4]: Запись unicoda в Mysql. Кто может помочь?
От: Sinclair Россия https://github.com/evilguest/
Дата: 18.02.04 09:18
Оценка: 3 (1)
Здравствуйте, 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 >>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[5]: Запись unicoda в Mysql. Кто может помочь?
От: Dimonka Верблюд  
Дата: 18.02.04 12:03
Оценка:
Здравствуйте, 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-совский способ кодирования, потому что он используется без дополнительных трудозатрат..
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.