如何在SQL Server中将latin1 varchar中的字符编码为插入MariaDB utf8?

时间:2018-05-18 09:24:03

标签: sql sql-server character-encoding mariadb

目前,我使用旧版SQL Server数据库中的SQLCMD进行提取,其中varchar列为latin1,并在文件中生成INSERT语句以将数据加载到MariaDB数据库中:

INSERT INTO maria_table (id, name, description) VALUES
 (210,'ALL.M.USDBBL','Refining GOA All Monthly')
,(211,'S.M.USDBBL','RefinGdd 2 BBL'
,(212,'R.M.USDBBL','RefinGdd 2BL') 
, etc

使用SQL Server命令和选项:

 SQLCMD.EXE -i "generate-inserts.sql" -h-1 -S "my-host" -d Tardis -r1 -W -b -f o:65001 > inserts.sql

还尝试了-u标志而没有运气。

这是SQL:

SELECT CONCAT('INSERT INTO maria_table (id, name, description)',
              ' VALUES ');

SELECT CONCAT(IIF(row_number() OVER (ORDER BY id ) = 1, ' ', ','),
    '(',
    id, ',',
    '''', dbo.encode4MySql(name), ''',',
    '''', dbo.encode4MySql(description), ''')'
)
FROM sql_srv_table WITH (NOLOCK)
ORDER BY id;

SELECT ';';

SELECT 'COMMIT;';

这是我需要开发的功能:

CREATE FUNCTION dbo.encode4MySql(@raw VARCHAR(4000))
      RETURNS VARCHAR(4000) AS BEGIN
  DECLARE @replaced VARCHAR(4000);

  SET @replaced = REPLACE(@raw, '''', '''''');

  ??? what do I do here to replace those special characters?

  RETURN @replaced;

END;

到目前为止,我所取代的只是'

但我从MariaDB那里得到这样的错误:

ERROR 1366 (22007) at line 384: 
    Incorrect string value: '\x87ao Su...' for column 'description' at row 1995

我在这里问了一个类似的问题SQL Server dump of varchar data to file loads in mysql but not mariadb,但基本上没有得到完整的解决方案,所以这次我要问的是如何对这个问题以及进一步不兼容的字符进行编码。

正如前一个问题上有人评论的那样,“\ x87可能是拉丁文1中的角色‡。”

我也无法在转储文件中找到特殊字符 - 使用\ x87ao或‡的任意组合搜索都不起作用。

1 个答案:

答案 0 :(得分:0)

至少有357个以87结尾的utf8字符。以下是其中一些:

| Ç               | LATIN CAPITAL LETTER C WITH CEDILLA      |
| ć               | LATIN SMALL LETTER C WITH ACUTE          |
| Ň               | LATIN CAPITAL LETTER N WITH CARON        |
| Ƈ               | LATIN CAPITAL LETTER C WITH HOOK         |
| LJ               | LATIN CAPITAL LETTER LJ                  |
| ȇ               | LATIN SMALL LETTER E WITH INVERTED BREVE |
| ɇ               | LATIN SMALL LETTER E WITH STROKE         |
| ʇ               | LATIN SMALL LETTER TURNED T              |
| ˇ               | CARON                                    |
| ·               | GREEK ANO TELEIA                         |
| χ               | GREEK SMALL LETTER CHI                   |
| Ї               | CYRILLIC CAPITAL LETTER YI               |
| ч               | CYRILLIC SMALL LETTER CHE                |

在您的文件中搜索ao Su,也许您可​​以找到它。

MariaDB中没有

cp1252;也许你正在使用latin1,这是相同的'?你用的是哪个版本?