
- в таблице строки хранятся в ASCII-кодировке;
- поле TDataSet типа ftString;
- TStringField.AsString вызывает GetValue, который распределяет выходной буфер размером DataSize и передает его в TDataSet.GetFieldData;
- После может быть вызван метод Transliterate, но ему снова принимающий буфер распределяется размером DataSize, и в UTF всё равно никак не странслировать.
Единственный выход сейчас - объявлять Size у таких полей в три раза больше и сразу перекодировать в UTF8.
Между тем Transliterate вполне можно переделать на работу с выходной строкой, а не буфером, и тогда все проблемы снимаются.
Или я чего не понимаю?
Я собрал примитивный пример: создал новое приложение, на форму положил TMemDataSet, создал в нем одно поле string длиной 12, активировал и подсоединил DbGrid. Как и следовало ожидать: ввести в поле можно все 12 символов кирилицы, но сохраняется меньше

Переходим на WideString?