qq_43063954
2020-12-26 12:08
采纳率: 100%
浏览 27

C# 操作Mysql 设置编码为 latin1 遇到的问题

 

如图所示 使用mysql.data 6.2.1.0查询到的数据 转码后就是正常的 而mysql.data高于这个版本查询到的数据转码后个别字符乱码

昨天折腾了一天都没解决 我知道UTF8好用 但是这是面向用户的东西 只能我兼容他们不能他们兼容我。。。。代码如下

 

private static async void Test()
        {

            string connStr = $"server=47.101.216.250;Database=master2;Uid=master2;Pwd=123456;Port=3306;Charset=utf8;Convert Zero Datetime=True;Allow Zero Datetime=True;";
            var conn = new MySqlConnection(connStr);
            conn.Open();
            MySqlCommand cmd = new MySqlCommand { Connection = conn };

            cmd.CommandText = "set names latin1; ";//设置编码 项目所需的编码
            cmd.ExecuteNonQuery();
            //很有意思的是设置编码为latin1后 mysql.data版本号为:6.2.1.0就可以正常使用 如果高于这个版本的mysql.data 取回的数据转码后个别字符是乱码的
            //当然使用 convert(unhex(hex(convert(charac_name using latin1))) using utf8)as charac_name  也是可以解决的 但是项目需要用实体框架这个方案行不通
            //实体框架要求mysql.data 版本号为:8.0.22所以低版本的mysql.data也不适用
            //昨天搞了一天都没解决掉 特此来论坛求救各位 我想使用8.0.22版本的mysql.data同时也能解决个别字符乱码的问题

            for (int i = 0; i < 10; i++)
            {
                cmd.CommandText = $"INSERT INTO char_data (charac_name) values('精易论坛{i}')";
                cmd.ExecuteNonQuery();
            }
            cmd.CommandText = "SELECT * FROM char_data WHERE charac_name='精易论坛1'";

            MySqlDataReader read = cmd.ExecuteReader();
            read.Read();
            var name = read[1].ToString();
            Console.WriteLine("返回结果:" + Conver(name));

            read.Close();
            conn.Close();


        }
        public static string Conver(string str)
        {
            if (str == null || str.Length == 0)
            {
                return string.Empty;
            }
            return Encoding.UTF8.GetString(Encoding.GetEncoding("iso-8859-1").GetBytes(str));
        }

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 邀请回答

20条回答 默认 最新

  • bosaidongmomo 2020-12-26 13:59
    已采纳

    q386847535

    点赞 评论
  • 歇歇 2020-12-26 13:09

    试一下这个函数

     string turnlatin1string(string source)        {            

     var en = System.Text.Encoding.GetEncoding("latin1");            

    var bs = en.GetBytes(source);                        

    var a = System.Text.Encoding.Default.GetString(bs);            

     return a;        

    }

    点赞 评论
  • 歇歇 2020-12-26 13:12

    或者查询之前,先运行set names utf8;

    点赞 评论
  • 歇歇 2020-12-26 13:17

    问题就出在这个connection连接层上。默认取值会转码,只能考虑怎么解决问题.

    点赞 评论
  • bosaidongmomo 2020-12-26 13:18

    set names utf8mb4

    点赞 评论
  • bosaidongmomo 2020-12-26 13:19

    你连接字符串上写的 utf8,然后为什么要转编码转到latin1

    点赞 评论
  • qq_43063954 2020-12-26 13:25

    楼上的方法都试过了不行 顶楼代码里面的数据库是开放的 你们可以测试一下 使用Mysql.data 6.2.1.0就没问题 高于这个版本的mysql.data 查询到的中文字符转码后个别字符就是乱码的

    点赞 评论
  • bosaidongmomo 2020-12-26 13:30
    点赞 评论
  • qq_43063954 2020-12-26 13:34

    这个项目只能我兼容用户不能用户兼容我 所以 latin1编码不能改。。。

    点赞 评论
  • 歇歇 2020-12-26 13:34

    latin1是万能编码,存的是任何字符,连二进制也能存,
    set names ascii, 客户端和服务端的字符集间将不进行任何转换。

    点赞 评论
  • bosaidongmomo 2020-12-26 13:44
    点赞 评论
  • bosaidongmomo 2020-12-26 13:45

    set names latin1 画蛇添足了

    点赞 评论
  • bosaidongmomo 2020-12-26 13:47

    最好的解决办法是,把旧版本的mysql 的数据 转存到dump中...

    然后用utf8mb4建表...

    然后就好啦..

    点赞 评论
  • bosaidongmomo 2020-12-26 13:48

    你库在上面的图片里泄露了...你改一下密码

    点赞 评论
  • qq_43063954 2020-12-26 13:56

    数据库是专门搭建给大家测试的 不担心泄露 我想要的就是不改变原有的数据 又能使用最新的Mysql.data  如果实在不行就只能放弃C#了。。。

    点赞 评论
  • qq_43063954 2020-12-26 13:59

     

    点赞 评论
  • bosaidongmomo 2020-12-26 13:59

    你能远程一下吗

    点赞 评论
  • qq_43063954 2020-12-26 13:59

    可以 加我吧 812143836

    点赞 评论
  • 歇歇 2020-12-26 14:24

    链接里有charset=utf8

    点赞 评论
  • qq_43063954 2020-12-26 14:30

    顶楼有源代码 你可以测试的哦亲

    点赞 评论

相关推荐 更多相似问题