You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Unity(C#)读取SQLite中文数据出现乱码问题求助

解决Unity+C#读取SQLite中文乱码问题

我之前在Unity项目里用C#操作SQLite时也踩过一模一样的中文乱码坑,太懂这种明明数据库里显示正常但读出来全是问号或者乱码的崩溃感了!先给你理清楚问题根源和可行的解决办法:

首先你说的编码基础是对的:SQLite默认确实用UTF-8存储,C#的字符串内部是UTF-16编码,但其实正常情况下SQLite的驱动(不管是System.Data.SQLite还是SQLite-net这类常用库)会自动帮你做编码转换,所以这通常不是直接的问题所在。你执行PRAGMA encoding = "UTF-16"没用,是因为这个命令只在数据库文件第一次创建的时候生效,如果你的数据库是之前就建好的,后续再执行这个命令根本不会改变已有数据库的编码,等于白做。

接下来给你几个针对性的排查和解决步骤:

  • 确认数据库创建时的编码
    如果你的数据库是之前用其他工具(比如Navicat、SQLiteStudio)创建的,先检查它的实际编码是不是UTF-8。打开数据库工具,查看数据库属性里的编码设置,确保是UTF-8。如果之前创建时用了其他编码,最好重新建一个UTF-8编码的数据库,再导入数据。

  • 检查SQLite驱动的使用方式
    不同的驱动库处理编码的细节不一样,这里给你两个常用库的正确操作示例:

    1. System.Data.SQLite
      不需要手动设置编码,直接用标准的连接字符串,读取时直接获取string即可,驱动会自动处理UTF-8到UTF-16的转换:
      string dbPath = Path.Combine(Application.persistentDataPath, "your_db.db");
      string connStr = $"Data Source={dbPath};Version=3;";
      using (SQLiteConnection conn = new SQLiteConnection(connStr))
      {
          conn.Open();
          using (SQLiteCommand cmd = new SQLiteCommand("SELECT your_chinese_column FROM your_table", conn))
          {
              using (SQLiteDataReader reader = cmd.ExecuteReader())
              {
                  while (reader.Read())
                  {
                      string chineseContent = reader.GetString(0);
                      Debug.Log("读取到的中文:" + chineseContent);
                  }
              }
          }
      }
      
    2. SQLite-net(Unity常用的轻量库)
      同样不需要额外设置编码,直接通过查询获取实体类或者字符串就行,注意不要手动转码:
      var db = new SQLiteConnection(dbPath);
      var dataList = db.Table<YourModel>().ToList();
      foreach (var item in dataList)
      {
          Debug.Log("中文内容:" + item.ChineseColumn);
      }
      
  • 绝对避免拼接SQL传递中文参数
    很多时候乱码是因为写入数据时用了字符串拼接SQL,导致编码转义出错。一定要用参数化查询来读写中文:

    // 错误示例:拼接SQL会导致编码问题
    // string sql = $"INSERT INTO your_table (chinese_col) VALUES ('{chineseText}')";
    
    // 正确示例:参数化查询
    using (SQLiteCommand cmd = new SQLiteCommand("INSERT INTO your_table (chinese_col) VALUES (@text)", conn))
    {
        cmd.Parameters.AddWithValue("@text", chineseText);
        cmd.ExecuteNonQuery();
    }
    
  • 手动编码转换(万不得已时用)
    如果以上方法都没用,可能是驱动的自动转换出了问题,可以尝试手动读取字节再转码:

    // 读取字节数组,再用UTF-8解码
    byte[] bytes = (byte[])reader.GetValue(0);
    string chineseText = Encoding.UTF8.GetString(bytes);
    

最后再提醒一句:既然你说数据库内的中文显示正常,说明数据本身是没问题的,问题肯定出在Unity读取时的编码转换或者驱动配置上,按照上面的步骤排查,应该很快就能解决!

内容的提问来源于stack exchange,提问作者RobinH

火山引擎 最新活动