Mysql5.7.22 坑爹的 `character_set_database`

Mysql5.7.22 坑爹的 character_set_database

Intro

今天用 EF Core Code First 生成数据库的时候,在初始化数据库的时候一直报错,后来debug的时候发现只要保存中文字符就会包异常,检查生成的数据库的编码竟然是 latin。

MySqlException: Incorrect string value: '\xE8\x81\x94\xE7\xB3\xBB...' for column 'TypeName' at row 1
MySqlConnector.Core.ResultSet.ReadResultSetHeaderAsync(IOBehavior ioBehavior) in ResultSet.cs, line 42

MySqlException: Incorrect string value: '\xE8\x81\x94\xE7\xB3\xBB...' for column 'TypeName' at row 1
MySql.Data.MySqlClient.MySqlDataReader.ActivateResultSet(ResultSet resultSet) in MySqlDataReader.cs, line 80

DbUpdateException: An error occurred while updating the entries. See the inner exception for details.
Microsoft.EntityFrameworkCore.Update.ReaderModificationCommandBatch.Execute(IRelationalConnection connection)

MySqlException: Incorrect string value: '\xE8\x81\x94\xE7\xB3\xBB...' for column 'TypeName' at row 1
MySqlConnector.Core.ResultSet.ReadResultSetHeaderAsync(IOBehavior ioBehavior) in ResultSet.cs

尝试更新MySql的默认编码,服务器上装的是 MySql 5.7,在网上找了许多方法都不奏效。

升级 8.0

尝试了各种办法 5.7.22 版本的mysql 无法更新 character_set_database,一直是 latin,从而导致每次新建数据的时候没有指定 charset 版本的时候都会以默认 lanti 编码,导致后面的数据保存到数据库的时候就会直接报错,。

经过查阅官网文档,可以看到 character_set_database 已经不再使用了,后面的版本就废弃了,到8.0就不需要这个了,如果没有指定charset,会使用 character-set-server=utf8mb4 的charset

最终决定升级 MySql 8.0,按照 StackOverflow 这篇文章 的介绍进行了升级。

升级之后重新设置 charset,character_set_database 终于正常了,终于不再是 latin 了,要注意的一个地方,mysql的utf8不是真正的utf8,是一个伪UTF8,utf8mb4才是真正的utf8,这里直接设置默认编码为 utf8mb4,设置完之后重启一下MySQL服务,

sudo service mysql restart

再看 char set 信息

2432073-ee2266cc2d76f270.png
charsets

升级完成之后再连接 mysql 服务器会报错,错误信息如下:

ERROR 1449 (HY000): The user specified as a definer ('mysql.infoschema'@'localhost') does not exist

解决方法:

在命令行中执行以下命令:

mysql_upgrade -u root -p

输入密码后,更新迁移完成,终于一切搞定了。

此时再连接数据,保存中文就再没有什么问题了。

Reference

猜你喜欢

转载自blog.csdn.net/weixin_34163741/article/details/87092121