【问题标题】:SISS MSSQL to MySQL with different collation is not copying finnish letter å使用不同排序规则的 SISS MSSQL 到 MySQL 不会复制芬兰字母 å
【发布时间】:2026-01-26 07:26:07
【问题描述】:

我不认为标题可以更好地描述为 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) ;
      

和错误:

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

这是有趣的部分:

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

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

【问题讨论】:

    标签: mysql sql-server ssis odbc collation


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

    【讨论】:

      最近更新 更多