You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C#读取文本存入MariaDB时出现Incorrect string value异常求助

解决C#写入MariaDB时的utf8mb4字符编码异常问题

我在C#代码中读取文本文件并写入MariaDB,数据库列的字符集为utf8mb4_unicode_ci,但仍抛出以下异常:

Incorrect string value: '\xEF\x83\x93 19...' for column ..v_desc at row 247

我尝试用readText.Replace("\xFFFD", "")修复,部分文件能正常写入,但仍有部分文件报错,而且这个方法会误将单引号替换为空,导致网页端显示异常。以下是相关代码片段:

dbfactory.AddInParam("desc", SqlType.VarChar, readText.Replace("\xFFFD", ""));
dbfactory.RunProc("sp name", out object returnValue);

解决方案

  • 确保数据库连接字符串指定utf8mb4编码
    在连接字符串中添加CharSet=utf8mb4参数,示例:

    Server=你的服务器地址;Database=目标数据库;Uid=用户名;Pwd=密码;CharSet=utf8mb4;
    

    这是解决编码不匹配的核心步骤,若连接时未指定字符集,驱动会默认使用utf8传输数据,导致utf8mb4的特殊字符无法正常写入。

  • 修正参数的类型定义
    代码中使用SqlType.VarChar可能会引发编码转换问题,建议改用SqlType.NVarChar,或者对应MariaDB驱动的MySqlDbType.VarChar并明确字符集,确保参数以utf8mb4编码传递。

  • 规范文本文件的读取编码
    读取文本文件时必须指定正确的编码(如UTF-8),避免依赖系统默认编码导致乱码:

    string readText = File.ReadAllText("目标文件路径.txt", Encoding.UTF8);
    

    若文件采用其他编码(如GBK),需先转换为UTF-8格式再进行后续处理。

  • 精准过滤无效字符
    \xFFFD是编码无法识别时的替换字符,直接全局替换会误删合法字符(如单引号)。可以通过正则表达式仅过滤数据库不支持的无效UTF-8字符:

    using System.Text.RegularExpressions;
    
    // 只过滤无效控制字符和替换字符,保留单引号等合法符号
    readText = Regex.Replace(readText, @"[\x00-\x1F\x7F-\x9F]|(?!')[\xFFFD]", "");
    
  • 检查存储过程的参数配置
    确认存储过程中desc参数的定义为VARCHAR(xxx) CHARACTER SET utf8mb4,避免存储过程内部将utf8mb4字符转码为utf8导致异常。

内容的提问来源于stack exchange,提问作者Ashutosh B Bodake

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 04:22:43