【问题标题】:c# MySql Not Writing utf-8 Charactersc# MySql 不写 utf-8 字符
【发布时间】:2016-02-17 20:43:19
【问题描述】:

我在将字符串写入包含 utf-8 字符的 mysql 数据库时遇到问题。角色之前的所有内容都被写入表格,但角色和之后的所有内容都不存在。

我检查了数据库的字符集,默认排序规则是utf8_general_ci,默认字符集是utf8。写入的列是 longtext 类型,排序规则为 utf8_general_ci

我也尝试将SET NAMES utf8; 添加到查询中,但这并没有改变结果。

下面是正在运行的代码示例:

using (var cmd = new MySqlCommand("insert into tablename (BodyText) values (@p1)", connection as MySqlConnection) { CommandType = CommandType.Text }) 
{
    cmd.Parameters.Add("@p1", BodyText);
    cmd.ExecuteNonQuery();
}

连接字符串是:

 "SERVER=xx;DATABASE=xx;USER=xx;PASSWORD=xx;Pooling=true;Validate Connection=true;CHARSET=UTF8"

尝试写入表格的文本是“谢谢!我看到它是另外 2 个 ???? 文本...”,以及写入表格的内容是“谢谢!我看到它是 2 ”。

我们将不胜感激。

更新:经过进一步研究,问题似乎是 MySql 中的基本 utf8 编码不支持 4 字节字符(其中 ???? 是)。对此的解决方案是更新 MySql 数据库以使用 utf8mb4 或在写入表之前从字符串中删除字符。第二种解决方案的问题是在大型代码库上,必须在将文本写入数据库的任何地方进行此检查。欢迎任何有关如何处理此问题的建议。

【问题讨论】:

    标签: c# mysql database encoding utf-8


    【解决方案1】:

    您可以可能将表格中的 utf8 更改为 utf8mb4,而不会丢失或损坏任何数据:

    ALTER TABLE tbl MODIFY COLUMN col ... CHARACTER SET utf8mb4 ...;
    

    (其中“...”是当前用于定义列的内容,例如 LONGTEXT。)您可能希望同时指定排序规则。

    如果失败,这可能会起作用:

    ALTER TABLE Tbl MODIFY COLUMN col LONGBLOB ...;
    ALTER TABLE Tbl MODIFY COLUMN col LONGTEXT ... CHARACTER SET utf8mb4 ...;
    

    如果col 在任何索引中,您可能希望在第一个 ALTER 中 DROP INDEX 并在第二个中添加 ADD INDEX。 (这是为了提高效率,也可能是为了避免索引限制。)

    【讨论】:

      猜你喜欢
      • 2023-03-27
      • 2011-09-06
      • 2011-02-26
      • 2013-07-07
      • 1970-01-01
      • 2017-03-04
      • 1970-01-01
      • 2014-08-06
      • 1970-01-01
      相关资源
      最近更新 更多