我通过cygwin命令行在windows10工作站上使用sqlcmd将sqlserver数据库中的大量字符串数据作为插入内容转储到文本文件中。
它可以很好地加载到mysql中,但在mariadb中我得到以下错误:
ERROR 1366 (22007) at line 384:
Incorrect string value: '\x87ao Su...' for column 'description' at row 1995
我的sql server db具有以下设置:
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函数转换文本-目前我只是转义'字符-但是如何转换呢?
[更新]刚刚发现,当我从文件运行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容器(空间有限)中运行它。
2条答案
按热度按时间z8dt9xmd1#
这个特殊的字符原来是c,带有一个塞迪拉,如
Curaçao
在转储的文件里是这样的从sql server导出后
SQLCMD -f o:65001
其中65001是microsoft utf8代码页。我也试过了
SQLCMD -f o:1252
因为数据库显示latin1
.由于这个出色的答案,我发现了什么是特殊字符。如何在SQLServer2005表的ntext字段中找到unicode/非ascii字符?
我假设mysql(相对于mariadb)只是毫无怨言地导入了它。
mariadb医生告诉我
--default-character-set
在命令行上,所以我试着latin1
以及utf8
,两者都不起作用。然后我查看了mariadb在中的一长串字符集
/usr/share/mysql/charsets/Index.xml
结果发现cp1250
毫无怨言的工作,但它进口的特殊性质作为‡
命令是mysql --default-character-set=cp1250
.我无法正确导入数据,但至少我现在可以在mariadb中导入了。
5us2dqdw2#
你得告诉我
sqlcmd
在创建sql文件转储时将输出文本转换为unicode。尝试使用
-u
转储文件时标记。或者在导入时尝试使用此标志,将其从拉丁文-1转换为utf-8
1252代表拉丁语-1,68001代表utf-8。
另外,对于mysql/mariadb数据,您应该考虑使用utf8mb4作为字符集,而不仅仅是utf8。这是一个解释。mysql中utf8mb4和utf8字符集的区别是什么?