寻找薛定谔的猫

导航

 

网站的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 试了一下终于可以正常连数据库了

 

下面是升级时遇到的一些错误

1、IIS报错:未能加载文件或程序集MySql.ConnectorInstaller, Version=8.0.8.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d或它的某一个依赖项

删除 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中指定

 

posted on 2022-11-30 21:20  teagueli  阅读(2090)  评论(0编辑  收藏  举报