【发布时间】:2018-05-17 12:34:03
【问题描述】:
我通过 cygwin 命令行使用 SQLCMD 将 SQL Server 数据库中的大量字符串数据作为 INSERTS 转储到我的 Windows10 工作站上的文本文件中。
它可以很好地加载到 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 函数转换文本 - 目前我只是转义 \' 字符 - 但如何?
[UPDATE] 刚刚发现当我从文件中运行 import 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 空间有限)中运行它云。
【问题讨论】:
标签: mysql sql-server mariadb