Хм. Я добавил iconv
поддержку FreeTDS и в некотором смысле несу ответственность за это сообщение об ошибке. У меня есть три вопроса и одно предложение.
Что кодирует целевой столбец, table_name.name
? Поддерживает ли эта кодировка символы, которые вы пытаетесь вставить? Уверен, что нет.
Выполняется ли клиентская кодировка в freetds.conf
набора символов, отраженного в locale (1)?
Вы уверены, что используете старый протокол TDS версии 4.1?
FreeTDS преобразует текст SQL в UTF-16. Когда вы интерполируете данные в оператор SQL insert
, FreeTDS преобразует весь оператор, данные и все. Если клиентская кодировка неправильно описана, данные не могут быть преобразованы. Если серверная кодировка не может представлять символ, данные не могут быть преобразованы. И если протокол древний, поддержка Unicode отсутствует.
Трудно сказать из вашего сообщения об ошибке, но мне кажется, что клиентская сторона выполнена успешно, а серверная сторона не удалась. То есть FreeTDS правильно преобразовал данные в UTF-16, но сервер не смог вставить данные в столбец name
, потому что это varchar
, а не nvarchar
, а «кодовая страница» для базы данных (или столбца, если указано) не тот, который может представлять эти символы.
Мое предложение - использовать TDS_DUMP и присоединиться к списку рассылки FreeTDS. Журнал TDS_DUMP ответит на все поставленные вами вопросы. И вы получите лучшую поддержку в списке рассылки, потому что она специализирована.
Ну, вы можете спросить, почему DBeaver работает. Я не знаю; Я до сих пор не слышал об этом. Я могу сказать вам, что есть способы вставить данные (например, с параметризованными запросами в ODBC), где сервер просто вставляет данные дословно. Как ни странно, он не проверяет, что они действительны для объявленной кодировки.
Я помог многим людям с такими проблемами.База данных настроена, скажем, на CP-1252, но данные неправильно закодированы. Приложение может вставлять неверно кодированные данные, а затем извлекать их и корректно отображать, скользить под радаром. Но пусть администратор баз данных попытается запросить данные или проверить их с помощью обычных инструментов администрирования, и они выглядят смешно. Сервер принимает данные в его базе данных кодируются в соответствии с определением базы данных. Когда это не так, наступает веселье!
Если это ваш случай, вы можете легко проверить его. Используйте DBeaver для вставки данных. Используйте приложение администратора SQL Server или добрый старый isql, чтобы получить его в Windows. Скорее всего, вы не будете удивлены.
Является ли ваш sql-стол полем nvarchar? Если нет, попробуйте это. –
Можете ли вы показать свой код? – Steven
@SeanB Да. Моя таблица sql только 'nvarchar'. – mkHun