sql server将varchar数据转储到mysql中的文件加载,但不加载mariadb

zc0qhyus  于 2021-06-21  发布在  Mysql
关注(0)|答案(2)|浏览(344)

我通过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容器(空间有限)中运行它。

z8dt9xmd

z8dt9xmd1#

这个特殊的字符原来是c,带有一个塞迪拉,如 Curaçao 在转储的文件里是这样的

Cura<87>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中导入了。

5us2dqdw

5us2dqdw2#

你得告诉我 sqlcmd 在创建sql文件转储时将输出文本转换为unicode。
尝试使用 -u 转储文件时标记。
或者在导入时尝试使用此标志,将其从拉丁文-1转换为utf-8

-f i:1252,o:65001

1252代表拉丁语-1,68001代表utf-8。
另外,对于mysql/mariadb数据,您应该考虑使用utf8mb4作为字符集,而不仅仅是utf8。这是一个解释。mysql中utf8mb4和utf8字符集的区别是什么?

相关问题