SQL Server将varchar数据转储到mysql中的文件加载但不是mariadb

时间:2018-05-17 12:34:03

标签: mysql sql-server mariadb

我通过cygwin命令行使用SQLCMD将大量字符串数据从SQL Server数据库转储到我的Windows10工作站上的INSERTS文本文件中。

它加载到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函数转换文本 - 此刻我正在逃避\'人物 - 但是如何?

[更新] 刚刚发现当我从文件运行导入SQL命令时,MariaDB对数据没有任何问题。

只有当我直接在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 

我想这样做,以便我不必在我的硬盘上创建一个10GB的SQL文件,或者我甚至可以在同一网络上的docker容器(有限的GB空间)中运行它在云上。

2 个答案:

答案 0 :(得分:0)

您需要告诉sqlcmd在创建SQL文件转储时将输出文本转换为unicode。

转储文件时,请尝试使用-u标记。

或者在导入时尝试使用此标志,从latin-1转换为utf-8

 -f i:1252,o:65001

1252是针对Latin-1的微软讲话和针对utf-8的68001。

顺便说一句,为了防范你的MySQL / MariaDB数据,你应该考虑使用utf8mb4作为你的字符集,而不仅仅是utf8。这是一个解释。 What is the difference between utf8mb4 and utf8 charsets in mysql?

答案 1 :(得分:0)

这个特殊角色在Curaçao

中被证明是带有cedilla的C.

在转储文件中看起来像这样

 Cura<87>ao 

从SQL Server导出SQLCMD -f o:65001后,其中65001是Microsoft UTF8代码页。

我也试过了SQLCMD -f o:1252,因为数据库说的是latin1

由于这个出色的答案How can I find Unicode/non-ASCII characters in an NTEXT field in a SQL Server 2005 table?

,我发现了这个特殊角色

我认为mySQL(而不是MariaDB)只是简单地导入它而没​​有抱怨。

MariaDB docs告诉我在命令行上设置--default-character-set,所以我尝试latin1utf8,但两者都没有效果。

然后我在/usr/share/mysql/charsets/Index.xml查看了MariaDB的长字符集列表,结果发现cp1250没有投诉,但它将特殊字符导入为

命令是mysql --default-character-set=cp1250

我无法正确导入数据,但至少我现在已经在MariaDB中导入了数据。