SISS MSSQL到MySQL使用不同的排序规则并不是复制芬兰字母å

时间:2018-04-10 17:57:07

标签: mysql sql-server ssis odbc collation

我不认为标题可以更好地描述为tl; dr,因为问题更深一些。

我有两个数据库(芬兰语):

MSSQL(排序规则:SQL_Latin1_General_CP437_CI_AI)

MySQL(排序规则:utf_general_ci)

我在vs2017中创建了BI项目,连接了两个数据库并将表从一个转移到另一个,没问题。除了1个字母:“å” - 而不是“?”。我无法更改任何数据库排序规则,所以我试图找到一种方法来转发这封信。

我尝试了什么:

  1. 旧数据库来源 - > ODBC目的地
  2. 点“1”,其间带有“数据转换”块(代码页1252)
  3. 脚本组件,我尝试过:

    • 插入“_latin”

      sql= "INSERT INTO db.words(Name) VALUES(_latin1'å')";
      byte[] b = Encoding.UTF8.GetBytes(sql);
      odbcCmd = new OdbcCommand(Encoding.UTF8.GetString(b), odbcConn);
      odbcCmd.ExecuteNonQuery();
      
    • 不带插入

        sql= "INSERT INTO db.words(Name) VALUES('å')";
        byte[] b = Encoding.UTF8.GetBytes(sql);
        odbcCmd = new OdbcCommand(Encoding.UTF8.GetString(b), odbcConn);
        odbcCmd.ExecuteNonQuery();
      
    • 不同的编码方式

       byte[] bytes = Encoding.GetEncoding(1252).GetBytes("å");
       var myString = Encoding.GetEncoding(1252).GetString(bytes);
       byte[] bytes2 = Encoding.Default.GetBytes("å");
       var myString2 = Encoding.Default.GetString(bytes2);
      
    • 插入带有错误的COLLATE

       insert into db.words(Name) values ("å" COLLATE latin1_swedish_ci) ;
      
  4. 和错误:

      

    System.Data.Odbc.OdbcException:“ERROR [HY000] [MySQL] [ODBC 5.3(a)驱动程序] [mysqld-5.7.21-log] COLLATION'latin1_swedish_ci'对CHARACTER SET'cp1250'无效”

    这是有趣的部分:

    我可以在MySQL Workbench中插入这个字母而没有问题,它会被插入,但是当我尝试将它从一个数据库传递到另一个数据库时,它就会丢失。我在数据转换之间设置了数据查看器,但字母仍然存在,并且在调试脚本时,它是在插入数据库的字符串中进行编码之后。

    也许有人知道我还能尝试什么,因为我觉得我已经尝试了一切,并且觉得这个问题的决心非常接近,但我只是看不到它。

1 个答案:

答案 0 :(得分:0)

  • CP1250不包括å; CP437和utf8确实包含它。
  • COLLATE无关紧要 - 它仅适用于比较和排序。
  • 不要使用任何编码/转换功能;相反,指定数据的编码方式。
  • 我看到'代码' - 但该语言和/或编辑器中源代码的编码是什么?
  • 向我们展示有问题的任何字符串的十六进制。
  • 你想转移哪个方向?
  • 每个数据库的连接参数是什么?