Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Базы данных и репортинг > Чтение данных (MySQL - utf8)


Автор: Serebrus 15.6.2009, 17:22
Привет всем.

Имеется MySQL база с кодировкой utf8_general_ci. При считывании данных из таблицы этой базы (кодировка таблицы тоже utf8_general_ci) результаты вот такие: ????? ??????
Функция Delphi UTF8Encode / Decode не помагла. Ответы этого форума на подобные вопросы (связанные с utf8) пролистал.
Что посоветуете?

Автор: Keeper89 15.6.2009, 17:30
UTF8ToAnsi пробовали?

Автор: Serebrus 15.6.2009, 17:45
Да, пробовал

Автор: Keeper89 15.6.2009, 17:49
Тогда код в студию, надо смотреть кодировки и т.д.

Автор: Serebrus 15.6.2009, 17:54
Вот пожалуйста,
чтение:
Код

with ZReadOnlyQuery1 do
 begin
  Close;
  SQL.Clear;
  SQL.Text:='select `id`,`fam`,`name` from `login` where `log`='''+login+''' and `pas`=md5('''+password+''');';
  //ShowMessage(SQL.Text);
  Open;
 end;

Результат:
Код

UserList:=ZReadOnlyQuery1fam.AsString+' '+ZReadOnlyQuery1name.AsString;
ShowMessage('Utf8ToAnsi: '+Utf8ToAnsi(UserList));

На экран:
Код

Utf8ToAnsi: ?????????? ?????

Можно ли при коннекте к базе данных, илиже при запросе задать кодировку (ну, как в php: set names...)?

Автор: Keeper89 15.6.2009, 18:09
А версия Delphi? Если 2009 и выше - конвертировать не надо вообще. Если ниже 2009 - данные надо конвертировать как в запрос, так и обратно.

Насчет принудительных кодировок: можно использовать 2 запроса при создании соединения:
Код

SET NAMES 'charset_name'
SET CHARACTER SET charset_name

И перевести все, например в cp1251.

Вот ресурсы по этому вопросу:
  • http://dev.mysql.com/doc/refman/5.0/en/charset-connection.html
  • http://dev.ezoterik.info/mysql-i-russkaya-kodirovka/

Автор: Akella 15.6.2009, 19:34
1. Serebrus, ты вообще куда данные выводишь, где хочешь увидеть?
2. Версию Delphi, компоненты и способ доступа, визуальные компоненты местные телепаты должны угадать? Ну жди, жди...
3. Кстати, для баз данных в дельфи есть отдельная ветка форума.

Автор: Serebrus 16.6.2009, 07:32
Akella, версия Delphi: 7, результат выводится в ListBox, доступ к базе данных осуществляется компонентами ZeosDbo 6.6.5

Автор: Akella 16.6.2009, 13:48
1. Дельфи 7 не поддерживает юникод.
2. Кодовую страницу при подключении какую указываешь?
3. Попробуй использовать сторонние компоненты с поддержкой юникода, например DevExpress или TNT, возможно, что и TMS

Автор: Serebrus 16.6.2009, 14:07
Akella, все в порядке.
Нашел такой выход:
Код

SetNamesQuery.SQL.Text:='set names cp1251';
...
procedure TForm1.FormCreate(Sender: TObject);
begin
ZConnection1.Connected:=True;
SetNamesQuery.ExecSQL;
end;

Автор: Akella 16.6.2009, 17:21
Цитата(Serebrus @  16.6.2009,  14:07 Найти цитируемый пост)
SetNamesQuery.SQL.Text:='set names cp1251';

ну вот  smile 

Автор: Keeper89 16.6.2009, 21:26
Цитата(Serebrus @  16.6.2009,  15:07 Найти цитируемый пост)
SetNamesQuery.SQL.Text:='set names cp1251';

Ну о чем я и говорил...

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)