最近遇到一个mysql生产问题,一直报:报错误 0x80004005 Incorrect string value: '\xF0\xA0\x83\x8A2\xE4...' for column
经过排查原来数据库和表都是默认utf8编码,老司机都知道,mysql中的utf8编码有一个大坑,不是真正的utf8。当遇到特殊字符就会插入失败报下面的错误:
MySql.Data.MySqlClient.MySqlException (0x80004005): Incorrect string value: '\xF0\xA0\x83\x8A2\xE4...' for column
使用环境:
1、asp.net core 2.2
3、mysql8
通过下面步骤完美解决:
一、首先查看当前数据库编码
show variables like 'character%'
最后必须要达到下面的设置:
二、更改数据库编码
ALTER DATABASE 数据库名称 DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
三、更改所有表和列编码
先生成所有表的更改语句,这样可以批量mysql所有表和列编码为utf8mb4
SELECT
CONCAT(
'ALTER TABLE ',
TABLE_NAME,
' CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;'
)
FROM
information_schema.`TABLES`
WHERE
TABLE_SCHEMA ='数据库名称';
把上面查询结果导出,执行就行了。
四、更改数据库配置
数据库配置my.ini或my.cnf,你的配置可能不叫这个句子。
修改为如下配置:
[client]
default-character-set=utf8mb4
[mysql]
default-character-set=utf8mb4
[mysqld]
collation-server = utf8mb4_general_ci
character-set-server = utf8mb4
更改之后重启mysql
五、修改数据库连接
经过上面4步骤,以为就万事大吉了。
注意:一定要修改程序的数据库连接,不然照样报错。
如下:
Host=localhost;Port=3306;Database=lanhu;Uid=www.lanhusoft.com;pwd=lanhusoft;Charset=utf8mb4;
之前我们写成utf8都不行,一定要写成utf8mb4