В Delphi Xe2 и MySQL 5.1 как вернуть строку UTF8 из запроса? - PullRequest
2 голосов
/ 11 января 2012

Я разрабатываю сервер DataSnap, который выполняет какой-либо запрос к БД MySQL 5.1, таблицы имеют формат UTF8, и я видел правильный латинский, китайский, японский, русский, греческий, хинди текст в таблицах.

При запросе к таблице я получаю "????? ..." в качестве ответа.

У меня установлены имена UTF8:

  SQLConnection1.Connected:= True;
  SQLConnection1.ExecuteDirect('set names utf8;');

тогда я делаю это:

  with DMMySQL.SQLDataSet1 do
  begin
    if Locate('COD_GOOGLE', LanguageValue, []) then
      Result:= UTF8Decode(FieldByName('DESCRIPTION').AsString); //
  end;

и Результатом всегда является "????? ...." с UTF8Decode или без него.

Где я не прав?

ТИА

Ответы [ 2 ]

1 голос
/ 11 января 2012

Когда вы устанавливаете набор символов для поля / таблицы, обычно это означает, что данные хранятся без преобразований с потерями, используется правильное сопоставление, а некоторые концы могут также экономить место.Например, UTF-8 будет эффективно хранить английские строки (и большинство западных языков) и будет все менее эффективен с другими языками по сравнению с UTF-16.Обычно драйвер - если установлен правильно - преобразует строку из набора символов базы данных в набор символов клиентского приложения.Вы не говорите, что вы используете для доступа к MySQL (dbExpress? ODBC? Other?).Поскольку строки Delphi Unicode имеют формат UTF-16, я полагаю, что драйвер по умолчанию скажет MySQL преобразовать данные в кодировку UTF-16 и обратно, используемую Delphi, независимо от того, какая кодировка используется для их хранения в таблице MYSQL.Если вы скажете MySQL возвращать данные в UTF-8, а код драйвера или базы данных Delphi все равно сохранит эти данные в строку UTF-16 без их преобразования, вы не получите ожидаемого результата.Что произойдет, если вы не зададите набор символов или используете кодировку UTF-16?

Обновление: в справке RAD Studio говорится (ms-help: //embarcadero.rs2010/rad/DbExpress_Data_Type_Mapping_for_Supported_Databases.html и http://docwiki.embarcadero.com/RADStudio/en/DbExpress_Data_Type_Mapping_for_Supported_Databases#MYSQL):

dbExpress имеет следующие сопоставления типов данных MYSQL:

char TDBXDataTypes.WideStringType, если сервер использует UTF-8, иначе TDBXDataTypes.AnsiStringType
varchar TDBXDataTypeYсервер использует UTF-8, в противном случае TDBXDataTypes.AnsiStringType

Таким образом, если сервер использует UTF-8, dbExpress должен обрабатывать данные в Delphi UTF-16, в противном случае в кодировке ANSI. Какой тип TField возвращает ваше приложение

0 голосов
/ 12 января 2012

Вы пробовали FieldByName('unicodefield').AsWideString?IIRC dbExpress возвращает AnsiString с AsString.

...