C#读取文本存入MariaDB时出现Incorrect string value异常求助
我在C#代码中读取文本文件并写入MariaDB,数据库列的字符集为utf8mb4_unicode_ci,但仍抛出以下异常:
Incorrect string value: '\xEF\x83\x93 19...' for column
..v_descat 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

