网站的MySQL升级,本以为很简单,结果发现各种不兼容,踩了不少坑。
首先MySQL,.Net Framework,MySQL Connector/NET (也就是mysql.data.dll,mysql.web.dll这两个文件)这三者之间的版本是有联系的
mysql.data.dll 6.9 之前的版本支持.Net Framework 4.0,新版的.net环境就不支持老的connector了
我原先的项目是基于.Net Framework3.5开发的,现在打算升级到4.0版本
于是就找了一个6.0.6.0版本的mysql.data.dll。
但是问题来了。MySQL8.0使用了新的utf8mb4编码,而没有utf8的选项,这种编码是低版本connetor不支持的(详细会在后面介绍)。
无奈只好使用高于6.9版本的mysql.data.dll,我选用了相对新的8.0.8.0,.Net framework升级到了4.5的版本。
项目所有引用的dll,只要用到mysql的,都跟着要升新
整了半天,以为大功告成了,结果提升我不支持utf8mb3编码,我明明是utf8mb4编码建的表,真是无语了。
网上查的只能升级到最新版本
.net framework4.8 + connector 8.0.31.0 试了一下终于可以正常连数据库了
下面是升级时遇到的一些错误
删除 machine.config中相关配置
1
2
3
4
5
|
< siteMap > < providers > < add name="MySqlSiteMapProvider" type="MySql.Web.SiteMap.MySqlSiteMapProvider, MySql.ConnectorInstaller, Version=8.0.8.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d" connectionStringName="LocalMySqlServer" applicationName="/"/> </ providers > </ siteMap > |
如果你的framework是4.0及以上,那么machine.config位置在C:\Windows\Microsoft.NET\Framework64\v4.0.30319\CONFIG目录下
如果是2.0或3.5,位置在<C:\Windows\Microsoft.NET\Framework\v2.0.50727\CONFIG目录下
2、连接数据库报错 Authentication method 'caching_sha2_password' not supported by any of the available plugins
在mysql的配置文件my.ini的Mysqld节点下添加以下配置并重启mysql服务
default_authentication_plugin=mysql_native_password
3、连接数据库报错 Character set ‘utf8mb3‘ is not supported by .Net Framework
虽然提示字符集为uft8mb3,实际是utf8mb4。升级MySQL conncector为最新版本。注意网站引用的dll,只要用到mysql.dll的,都需要更新。
4、发布网站时IIS报错 The connection string name is missing for the MySqlSiteMapProvider
删除machine.config中相关配置(siteMap节点)
5、发布网站时IIS报错 GUID 应包含带 4 个短划线的 32 位数(xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx)
在连接字符串中添加 Old Guids=true;
例如 server=localhost;userid=root;password=123456;database=dbname;Old Guids=true;
6、发布网站时IIS报错 Unable to initialize provider. Missing or incorrect schema
项目中采用了membership,安装新数据库时直接copy了原数据库的membership表
解决办法,在网站管理工具中重新创建用户和角色。打开网站管理工具的方法:点击这里
7、执行查询报错
[Err] 1055 - Expression #1 of ORDER BY clause is not in GROUP BY clause and contains nonaggregated column ‘information_schema.PROFILING.SEQ’ which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by
原因是数据库版本升级到8.0或以上造成
在my.ini的mysqld节点下加一行配置
sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
8、连接数据库报错:给定关键字不在字典中
MySQL升级后字符集编码不一致导致的。解决方案是更新mysql.data.dll版本,然而我的项目版本低,更新mysql.data.dll意味着我的.net必须也要更新才可以
需要注意的地方
1、关于Mysql8.0的字符集编码
在web.config 链接字符串中要加上一行 charset=utf8mb4;
在MySQL配置文件my.ini中设置默认编码,如下
[client] default-character-set = utf8mb4 [mysql] #设置mysql数据库客户端默认字符集 default-character-set = utf8mb4 [mysqld] #设置mysql数据库默认端口号,注意端口号不能被占用 port=3306 #设置记录日志的显示时间 log_timestamps=SYSTEM #设置mysql安装目录 basedir=C:\\Program Files\\mysql-8.0.31-winx64 #设置mysql数据库的数据存放目录 datadir=C:\\Program Files\\mysql-8.0.31-winx64\\data #设置mysql数据库服务端默认字符集 character-set-server = utf8mb4 collation-server=utf8mb4_general_ci #设置mysql数据库创建新表时的默认存储引擎 default-storage-engine=INNODB #设置mysql数据库允许的最大链接数 max_connections=100 default_authentication_plugin=mysql_native_password sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
2、MySQL8.0的my.ini默认安装好是不存在的,需要手动添加
3、MySQL8.0的data目录是不存在的,需要手动添加,并在my.ini中指定