我使用MySql.Data MySqlClient在C#中的MySql 8服务器上运行UPDATE查询。我正在使用一个patamerateized查询,并试图将一个非BMP(补充(unicode表情符号添加到我的表值中(这个问题也发生在一些汉字中(。
MySql.Data.MySqlClient.MySqlCommand query = _connection.CreateCommand();
query.CommandText = "UPDATE favorites SET fruit = @favFruit WHERE id = 1";
MySql.Data.MySqlClient.MySqlParameter parameter = query.CreateParameter();
parameter.ParameterName = "favFruit";
parameter.Value = "🥑";
query.Parameters.Add(parameter);
query.ExecuteNonQuery();
我的查询Incorrect string value: 'xF0' for column 'fruit' at row 1
失败
我花了一整天的时间寻找解决问题的办法。我试过:
- 将
CHARSET=utf8mb4;
添加到mt连接字符串,这很重要,也是必需的 - 确保我的数据库、表和列使用
utf8mb4
字符集和utf8mb4_0900_ai_ci
排序规则,这很重要,也是必需的,因为utf8实际上是";Unicode的一部分";在MySQL中 - 尝试调用
SET NAMES utf8mb4
,但没有执行任何操作,因为服务器排序规则都已正确设置为utf8mb4,如SHOW VARIABLES WHERE Variable_name LIKE 'character_set_%' OR Variable_name LIKE 'collation%';
所示-请参阅MySQL utf8mb 4,保存表情包时的错误 - 将my.ini中所有推荐的默认值设置为web上推荐的值
但它仍然不起作用!我不知道还能做什么!
浪费了一整天,结果发现MySql.Data MySqlClient中默认的参数类型是Blob。在查询执行过程中转换此值时,会出现某些无法正确转换Unicode的情况。
添加parameter.MySqlDbType = MySql.Data.MySqlClient.MySqlDbType.VarString;
修复了所有问题。
即
MySql.Data.MySqlClient.MySqlParameter parameter = query.CreateParameter();
parameter.MySqlDbType = MySql.Data.MySqlClient.MySqlDbType.VarString;
parameter.ParameterName = "favFruit";
parameter.Value = "🥑"