Дамп SQL Server данных varchar в файл загружается в MySQL, но не mariadb - PullRequest
0 голосов
/ 17 мая 2018

Я выгружал много строковых данных из базы данных SQL Server в текстовый файл как INSERTS на моей рабочей станции Windows10, используя SQLCMD через командную строку cygwin.

Он нормально загружается в MySQL, но в mariadb я получаю эту ошибку:

ERROR 1366 (22007) at line 384: 
    Incorrect string value: '\x87ao Su...' for column 'description' at row 1995

Моя БД SQL Server имеет следующие настройки:

SELECT DISTINCT C.collation_name 
FROM   sys.tables AS T 
       INNER JOIN sys.columns C 
               ON T.object_id = C.object_id 
WHERE  collation_name IS NOT NULL; 

collation_name: Latin1_General_CI_AS

SELECT DISTINCT C.collation_name 
FROM   sys.tables AS T 
       INNER JOIN sys.columns C 
               ON T.object_id = C.object_id 
WHERE  collation_name IS NOT NULL; 
collation_name: Latin1_General_CI_AS

и это MySQL (куда он вставляет счастливо):

SHOW FULL COLUMNS FROM forecast
--------------

+--------------------+------------------+-----------------+------+-----+-------------------+----------------+---------------------------------+---------+
| Field              | Type             | Collation       | Null | Key | Default           | Extra          | Privileges                      | Comment |
+--------------------+------------------+-----------------+------+-----+-------------------+----------------+---------------------------------+---------+
| description        | varchar(255)     | utf8_unicode_ci | YES  |     | NULL              |                | select,insert,update,references |         |

SELECT @@character_set_database, @@collation_database, @@collation_connection
--------------

+--------------------------+----------------------+------------------------+
| @@character_set_database | @@collation_database | @@collation_connection |
+--------------------------+----------------------+------------------------+
| utf8                     | utf8_unicode_ci      | utf8_general_ci        |
+--------------------------+----------------------+------------------------+
1 row in set (0.01 sec)

и это из MariaDB, где выдает эту ошибку выше:

SHOW FULL COLUMNS FROM forecast
--------------

+--------------------+------------------+-----------------+------+-----+---------------------+----------------+---------------------------------+---------+
| Field              | Type             | Collation       | Null | Key | Default             | Extra          | Privileges                      | Comment |
+--------------------+------------------+-----------------+------+-----+---------------------+----------------+---------------------------------+---------+
| description        | varchar(255)     | utf8_unicode_ci | YES  |     | NULL                |                | select,insert,update,references |         |
+--------------------+------------------+-----------------+------+-----+---------------------+----------------+---------------------------------+---------+
10 rows in set (0.01 sec)

MariaDB [tardis]> SELECT @@character_set_database, @@collation_database, @@collation_connection;
--------------
SELECT @@character_set_database, @@collation_database, @@collation_connection
--------------

+--------------------------+----------------------+------------------------+
| @@character_set_database | @@collation_database | @@collation_connection |
+--------------------------+----------------------+------------------------+
| utf8                     | utf8_unicode_ci      | utf8_general_ci        |
+--------------------------+----------------------+------------------------+
1 row in set (0.01 sec)

Насколько я могу судить, MariaDB должна вести себя так же, как MySQL, но это не так.

Что мне делать?

Я мог бы преобразовать текст с помощью функции SQL Server - на данный момент я просто экранирую \ 'символы - но как?

[ОБНОВЛЕНИЕ] Только что обнаружил, что у MariaDB нет проблем с данными, когда я запускаю команды импорта SQL из файла.

Только когда я передаю его напрямую в командной строке из SQLCMD в mysql.exe, я получаю сообщение об ошибке:

$ SQLCMD.EXE -i "c:\dev\workspace\sql\generate-inserts-for-migration.sql" \
       -h-1 -S "myhost" -d MyDBName -r1 -W \
       -b -f o:65001 | mysql -h myhost.amazonaws.com -u adam -p 

Я хотел сделать это так, чтобы мне не нужно было создавать файл SQL объемом 10 ГБ на жестком диске, или я мог даже запустить его в док-контейнере (с ограниченным пространством ГБ) в той же сети в сети. облако.

Ответы [ 2 ]

0 голосов
/ 18 мая 2018

Специальным символом оказался C с cedilla, как в Curaçao

, который выглядел следующим образом в выгруженном файле

 Cura<87>ao 

после его экспорта из SQL Server с помощью SQLCMD -f o:65001, где 65001 - кодовая страница Microsoft UTF8.

Я также пытался SQLCMD -f o:1252, поскольку в базе данных указано, что это latin1.

Я обнаружил, что это за специальный символ, благодаря этому превосходному ответу Как найти символы Unicode / не-ASCII в поле NTEXT в таблице SQL Server 2005?

, и я предполагаю, что mySQL (в отличие от MariaDB) просто плохо импортировал его безжалоба.

Документы MariaDB велели мне правильно установить --default-character-set в командной строке, поэтому я попытался latin1 и utf8, но ни один из них не сработал.

Затем я посмотрел длинный список наборов символов для MariaDB в /usr/share/mysql/charsets/Index.xml, и оказалось, что cp1250 работает без жалоб, но он импортирует специальный символ как

.команда была mysql --default-character-set=cp1250.

Мне не удалось правильно импортировать данные, но, по крайней мере, теперь я могу импортировать их в MariaDB.

0 голосов
/ 17 мая 2018

Вам нужно указать sqlcmd, чтобы при выводе файла SQL преобразовывать выводимый текст в Unicode.

Попробуйте использовать флаг -u при выгрузке файла.

Или попробуйте использовать этот флаг при импорте, чтобы перевести с латиницы-1 на utf-8

 -f i:1252,o:65001

1252 - говорит по-латыни для латыни-1 и 68001 для utf-8.

И, кстати, для обеспечения безопасности ваших данных MySQL / MariaDB в будущем вам следует рассмотреть возможность использования utf8mb4 в качестве набора символов, а не просто utf8.Вот объяснение. В чем разница между кодировками utf8mb4 и utf8 в mysql?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...