Я не думаю, что название можно было бы лучше описать как tl; dr, потому что проблема немного глубже.
У меня две базы данных (финский язык):
MSSQL (сопоставление: SQL_Latin1_General_CP437_CI_AI)
MySQL (сортировка: utf_general_ci)
Я создал проект BI в vs2017, подключил две базы данных и передал таблицы от одного к другому, без проблем. За исключением 1 буквы: "å" - вместо этого было "?". Я не могу изменить сортировку базы данных, поэтому я пытаюсь найти способ передать слова с этим письмом.
Что я пробовал:
Компонент скрипта, в котором я попытался:
Вставить с помощью "_latin"
sql= "INSERT INTO db.words(Name) VALUES(_latin1'å')";
byte[] b = Encoding.UTF8.GetBytes(sql);
odbcCmd = new OdbcCommand(Encoding.UTF8.GetString(b), odbcConn);
odbcCmd.ExecuteNonQuery();
Вставить без него
sql= "INSERT INTO db.words(Name) VALUES('å')";
byte[] b = Encoding.UTF8.GetBytes(sql);
odbcCmd = new OdbcCommand(Encoding.UTF8.GetString(b), odbcConn);
odbcCmd.ExecuteNonQuery();
Различные способы кодирования
byte[] bytes = Encoding.GetEncoding(1252).GetBytes("å");
var myString = Encoding.GetEncoding(1252).GetString(bytes);
byte[] bytes2 = Encoding.Default.GetBytes("å");
var myString2 = Encoding.Default.GetString(bytes2);
Вставить с помощью COLLATE, который получил ошибку
insert into db.words(Name) values ("å" COLLATE latin1_swedish_ci) ;
и ошибка:
System.Data.Odbc.OdbcException: "ERROR [HY000] [MySQL] [ODBC 5.3 (a) Драйвер] [mysqld-5.7.21-log] COLLATION 'latin1_swedish_ci' недействителен для CHARACTER SET 'cp1250'"
Вот интересная часть:
Я могу сделать вставку с этим письмом в MySQL Workbench без проблем, и она будет вставлена, но когда я попытаюсь передать ее из одной базы данных в другую, она будет потеряна. Я установил Data Viewers между Data Conversion, и письмо все еще было там, а также при отладке скрипта оно было после кодирования в строке, которая была вставлена в базу данных.
Может быть, кто-то понял, что еще я могу попробовать, потому что чувствую, что я все пробовал, и чувствую, что решение этой проблемы действительно близко, но я просто этого не вижу.
å
; CP437 и utf8 включают его.COLLATE
имеет значения - применяется только для сравнения и сортировки.