2017-02-23 68 views
7

Я работаю над Ubuntu, и я использую DBeaver для доступа к БД. Я пытаюсь вставить латиницу в базу данных (MSSQL), и она выдает ошибку. Но если я вставляю тот же специальный символ с DBeaver, он не бросает никаких ошибок и работает. Я уже видел this вопрос. Но я понятия не имею.Как вставить специальный символ в БД?

Он бросает следующее сообщение об ошибке:

DBD::ODBC::st execute failed: [unixODBC][FreeTDS][SQL Server]Error converting characters into server's character set. Some character(s) could not be converted (SQL-HY000) at expert.fi_review.pl line 243. 

и данные в БД J�rjest�myyr�. Но фактические данные - Järjestömyyrä.

Пример кода:

my ($dsn,$dbh); 
&DB_Connect; 

$insert_query = "INSERT INTO table_name (name) values(N'$name')"; 
my $sth = $dbh->prepare($insert_query); 
$sth->execute() or $DB_Error=$DBI::errstr; 

sub DB_Connect 
{ 
    $dsn = "dbi:ODBC:driver={SQL Server};Server=$Server_name,$port;database=$Database_name;driver=FreeTDS;tds_version=8.0;"; 
    reconnect: $dbh = DBI->connect($dsn, $db_user_id, $db_pwd ,{AutoCommit => 1}) or goto reconnect; 
    $dbh-> {'LongTruncOk'} = 1; 
    $dbh-> {'LongReadLen'} = 90000; 
} 
+0

Является ли ваш sql-стол полем nvarchar? Если нет, попробуйте это. –

+0

Можете ли вы показать свой код? – Steven

+0

@SeanB Да. Моя таблица sql только 'nvarchar'. – mkHun

ответ

-1

Ваша ошибка в том разделе, как SQL Server, так как ошибка на вашей стороне клиента с помощью Perl который где отказ происходит.

Помимо этого, вы используете сторонние библиотеки и инструменты управления, когда нет необходимости делать это функционально или по доллару, а тем более для поддержки.

Как уже отмечали комментаторы, текст Umlaut является символом Unicode, поэтому столбцы должны быть либо nvarchar, либо nText. https://msdn.microsoft.com/en-us/library/ms186939.aspx

Если вы решите использовать SSMS и SSDT, я уверен, что сообщество SQL Server предложит вам лучшую поддержку. Нет необходимости использовать Perl для выполнения этой простой передачи данных.

SQLSTATE [HY000]: Общая ошибка: 1366 Неверное значение строки для поля с акцентами -

очень похожи вопрос появляется here as well

0

Преобразуйте utf-8 в utf-16, прежде чем вставлять его в столбец nvarchar.

И вернитесь к utf-8 при чтении.

Или используйте столбец varbinary и сохраните там простые utf-8 байтов. Хранение данных, закодированных utf-8 в столбце nvarchar, неверно.

0

Вы пытаетесь изменить код, как это?

$insert_query = "INSERT INTO table_name (name) values(?)"; 
my $sth = $dbh->prepare($insert_query); 
$sth->bind_param(1, $name, DBI::SQL_WVARCHAR); 
$sth->execute() or $DB_Error=$DBI::errstr; 
0

Преобразование поля в utf8_unicode_ci

Пример: ALTER TABLE t CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci;

Или, если это запрос:

SELECT * FROM `INFORMATION_SCHEMA.COLUMNS` 
WHERE TABLE_SCHEMA = 'dbname' AND CHARACTER_SET_NAME = 'latin1' 
0

Ваш вопрос, не ясно, когда речь идет.

Если из Perl, Вы можете просто закодировать его с помощью url escape function

use URI::Escape; 
my $string = "Järjestömyyrä"; 
my $encode = uri_escape($string); 
my $decode = uri_unescape($encode); 

JavaScript альтернатива для просмотра здесь

var a="Järjestömyyrä"; 
 
var b=encodeURIComponent(a); 
 
console.log("Encode : "+b); 
 
console.log("Decode : "+decodeURIComponent(b));

Если проблема приходит при попытке вставить непосредственно в базу данных,

Тогда вы должны изменить структуру таблицы и установите CHARSET to latin1

ALTER TABLE table_name ALTER COLUMN name varchar(20) COLLATE Latin1_General_CI_AS NOT NULL; 

Эти ссылки помогут вам в этом:

1: http://kunststube.net/frontback/
2: https://msdn.microsoft.com/en-us/library/ms190920.aspx

1

Хм. Я добавил iconv поддержку FreeTDS и в некотором смысле несу ответственность за это сообщение об ошибке. У меня есть три вопроса и одно предложение.

  1. Что кодирует целевой столбец, table_name.name? Поддерживает ли эта кодировка символы, которые вы пытаетесь вставить? Уверен, что нет.

  2. Выполняется ли клиентская кодировка в freetds.conf набора символов, отраженного в locale (1)?

  3. Вы уверены, что используете старый протокол 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. Скорее всего, вы не будете удивлены.

Смежные вопросы