Оказалось, что "исправление втихоря" в 4-ке было связано с переходом на Unicode. В общем, метод find() ищет строки, используя итератор и передавая ему ссылку на функцию сравнения записей; та же, в свою очередь, перво-наперво сравнивает коды компаний двух записей, а потом пробегается по полям, используемым для сортировки, и сравнивает их значения с помощью некой функции _DBICompare().
Данная функция предназначена для сравнения уникальных ключей, составленных из значений различных примитивных типов (строковые, BCD, целочисленные, даты, etc). В основном это используется, я так понял, на DataSource'ах, при переиндексации таблиц через DictTable.reindex() и xCompany.reindex(), а также в RecordSortedList, в UtilElements, возможно, и во временных таблицах. Так вот, при условии, что в текущей локали не используется какая-нить
многобайтовая кодировка и база не инициализирована для использования Unicode'а, для строковых значений эта функция в 3-ке тупо использует функцию
strncmp() со всеми вытекающими... В 4-ке же используется CompareStringW() из kernel32.dll с флагами
NORM_IGNORECASE | NORM_IGNOREKANATYPE | NORM_IGNOREWIDTH, поэтому и работает все, как положено.