我通过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空间)中运行它在云上。
答案 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
在转储文件中看起来像这样
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
,所以我尝试latin1
和utf8
,但两者都没有效果。
然后我在/usr/share/mysql/charsets/Index.xml
查看了MariaDB的长字符集列表,结果发现cp1250
没有投诉,但它将特殊字符导入为‡
命令是mysql --default-character-set=cp1250
。
我无法正确导入数据,但至少我现在已经在MariaDB中导入了数据。