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 信息
charsets
升级完成之后再连接 mysql 服务器会报错,错误信息如下:
ERROR 1449 (HY000): The user specified as a definer ('mysql.infoschema'@'localhost') does not exist
解决方法:
在命令行中执行以下命令:
mysql_upgrade -u root -p
输入密码后,更新迁移完成,终于一切搞定了。
此时再连接数据,保存中文就再没有什么问题了。
作者:天天向上卡索
链接:https://www.jianshu.com/p/65c526cd7572