DataBase – 清风亦平凡 https://www.mlplus.net 关注IT世界,记录平凡生活 Thu, 04 Aug 2022 16:16:17 +0000 zh-CN hourly 1 https://wordpress.org/?v=6.4.3 MYSQL修改数据库、表、字段字符集 https://www.mlplus.net/2022/08/05/mysql-update-character/ https://www.mlplus.net/2022/08/05/mysql-update-character/#respond Fri, 05 Aug 2022 01:00:00 +0000 https://www.mlplus.net/?p=3906 背景

由于mysql低版本暴了漏洞,所以客户就升级了mysql版本。升级到了最新版8.0.30,升级最新版后,应用就再也查不出数据,恢复到最初的版本有可以查到数据。经过确认最初数据库的表字符集为utf8,升级后这些字符集自动修改为utf8mb3。新版本数据库移除了utf8字符集,而应用本身不支持utf8mb3,所以需要修改这些字符集。经过再次确认最新版mysql以及应用都支持utf8mb4,最终决定修改字符集为utf8mb4

修改字符集

数据库


ALTER DATABASE 数据库名称 DEFAULT CHARACTER SET 编码名称 [COLLATE ...];

例如:


ALTER DATABASE activity CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci;

ALTER TABLE 表名称  CONVERT TO CHARACTER SET 编码名称 [COLLATE ...]

例如:

ALTER TABLE users CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;

以上修改会同时变更现有数据的字符集。如果只修改表的默认字符集,而不修改现有数据的字符集可以使用以下内容


ALTER TABLE 表名称 DEFAULT CHARACTER SET 编码名称 [COLLATE...];

例如:

ALTER TABLE users DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;

字段

ALTER TABLE 表名称 CHANGE 字段名称 字段名称 CHARACTER SET 编码名称 [COLLATE ...];

例如:

ALTER TABLE users CHANGE LoginName LoginName VARCHAR(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;

批量修改数据库表字符集

第一步

使用以下脚本并执行,产生修改数据表字符集的脚本。

SELECT 
CONCAT("ALTER TABLE ",TABLE_SCHEMA,'.',TABLE_NAME," CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;") 
AS target_tables
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_SCHEMA IN('数据库名称','数据库名称') 
AND TABLE_TYPE="BASE TABLE";

例如:

SELECT 
CONCAT("ALTER TABLE ",TABLE_SCHEMA,'.',TABLE_NAME," CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;") 
AS target_tables
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_SCHEMA IN('phpdbeqx') 
AND TABLE_TYPE="BASE TABLE";
MYSQL修改数据库、表、字段字符集-第0张图片

导出以上查询结果,执行导出的查询结果即可。如果数据量比较大,执行的时间可能会比较久。

查看字符集

查看数据库支持的字符集

select * from information_schema.character_sets;

查看数据库支持的检验规则

select * from information_schema.collations;

查看表字符集及检验规则

select * from information_schema.tables where table_name='表名' 

查看字段编码

SHOW FULL COLUMNS FROM  表名



转载请注明:清风亦平凡 » MYSQL修改数据库、表、字段字符集

]]>
https://www.mlplus.net/2022/08/05/mysql-update-character/feed/ 0
解决MYSQL连接异常:SQLSTATE[HY000] [2054] https://www.mlplus.net/2022/07/29/mysql-sqlstate-hy000-2054/ https://www.mlplus.net/2022/07/29/mysql-sqlstate-hy000-2054/#respond Fri, 29 Jul 2022 03:11:41 +0000 https://www.mlplus.net/?p=3881 异常信息

SQLSTATE[HY000] [2054] The server requested authentication method unknown to the client[/app/thinkphp/library/think/db/Connection.php:295]

解决MYSQL连接异常:SQLSTATE[HY000] [2054]-第0张图片

原因

MySQL8中用户的认证类型(Authentication type)默认为cacheing sha2 password导致的错误,需要修改用户权限认证方式为mysql_native_password

我这个错误就是因为数据库升级导致的。

解决办法

  • 数据库降级,退回以前版本
  • 改为mysql_native_password认证方式

数据库退回以前的版本,这里不进行操作了。下面只针对认证方式改回mysql_native_password的方式。

修改mysql配置文件my.cnf

vi /etc/my.cnf

[mysqld]节点下如下内容,如果以及存在default_authentication_plugin节点,覆盖即可。

default_authentication_plugin=mysql_native_password
解决MYSQL连接异常:SQLSTATE[HY000] [2054]-第1张图片

由于更改了认证方式,所以要更改链接MYSQL用户的密码。以下以root为例

mysql -u root -p

执行以下代码完成链接MYSQL的用户密码的修改。


alter user '用户'@'%' identified with mysql_native_password by '密码';

flush privileges;

root用户为例


alter user 'root'@'%' identified with mysql_native_password by '123456';
flush privileges;

操作完毕后,重启MYSQL服务。



转载请注明:清风亦平凡 » 解决MYSQL连接异常:SQLSTATE[HY000] [2054]

]]>
https://www.mlplus.net/2022/07/29/mysql-sqlstate-hy000-2054/feed/ 0
使用sqlserver的排名函数实现积分排名 https://www.mlplus.net/2022/04/06/sql-server-rank-handle/ https://www.mlplus.net/2022/04/06/sql-server-rank-handle/#respond Wed, 06 Apr 2022 01:00:00 +0000 https://www.mlplus.net/?p=3828 背景

客户需要针对用户的积分进行排名,按照积分的多少降序进行。为了更快更好的满足客户需求,就采取了SQL Server已有的排名函数RANKDENSE_RANK来实现

RANK

返回结果集的分区内每行的排名。 行的排名是相关行之前的排名数加一。

ROW_NUMBER RANK 类似。 ROW_NUMBER 按顺序对所有行进行编号(例如: 1、2、3、4、5)。 RANK 为相应关联提供相同的数值(例如: 1、2、2、4、5)。

RANK是运行查询时计算出的临时值

语法


RANK ( ) OVER ( [ partition_by_clause ] order_by_clause )
如果两个或多个行与一个排名关联,则每个关联行将得到相同的排名

DENSE_RANK

此函数返回结果集分区中每行的排名,排名值没有间断。 特定行的排名等于该特定行之前不同排名值的数量加一。

语法

DENSE_RANK ( ) OVER ( [ <partition_by_clause> ] < order_by_clause > )
如果两个或更多行在同一分区中具有相同的排名值,那么每个行将获得相同的排名

积分排名实现

数据准备

-- 创建积分表
Create table integral
(
  userUid varchar(36),
  integralScore decimal(18,2)
);
-- 创建用户表
Create table UserInfo
(
 userUid varchar(36),
 user_name varchar(100)
);
--查询
with integral AS
(
   select userUid, ISNULL(SUM(integralScore), 0) as integralScore  from integral  group by userUid
)
,
ranks AS(
select  rank() OVER(order by integralScore desc) as ranks,integral.integralScore,UserInfo.user_name from  integral Inner Join UserInfo  on integral.userUid=UserInfo.userUid
  
)
select  * from ranks;
使用sqlserver的排名函数实现积分排名-第0张图片

rank函数实现排名,排名不连续,排名会跳过序号。如上图所示。此种情况可以使用dense_rank函数来解决,这样排名需要就会连续出现。


with integral AS
(
   select userUid, ISNULL(SUM(integralScore), 0) as integralScore  from integral  group by userUid
)
,
ranks AS(
select  dense_rank() OVER(order by integralScore desc) as ranks,integral.integralScore,UserInfo.user_name from  integral Inner Join UserInfo  on integral.userUid=UserInfo.userUid
)
select  * from ranks;
使用sqlserver的排名函数实现积分排名-第1张图片

当使用dense_rank函数排名后,就完美避免了排名跳编号的问题。



转载请注明:清风亦平凡 » 使用sqlserver的排名函数实现积分排名

]]>
https://www.mlplus.net/2022/04/06/sql-server-rank-handle/feed/ 0
MySQL存储过程中使用游标 https://www.mlplus.net/2021/08/28/mysql-cursor/ https://www.mlplus.net/2021/08/28/mysql-cursor/#respond Sat, 28 Aug 2021 07:14:01 +0000 https://www.mlplus.net/?p=3664
MySQL存储过程中使用游标-第0张图片

游标

游标的设计是一种数据缓冲区的思想,用来存放SQL语句执行的结果。游标是一种能从包括多条数据记录的结果集中每次提取一条记录的机制。

游标的特性

游标具有以下三个特性:

  • 不敏感(Asensitive)
    数据库可以选择不复制结果集
  • 只读(Read only)
  • 不滚动(Nonscrollable)
    游标只能向一个方向前进,并且不可以跳过任何一行数据

游标的优点

游标是针对行操作的,对从数据库中SELECT查询得到的结果集的每一行可以进行分开的独立的相同或不同的操作,是一种分离的思想。游标是面向集合与面向行的设计思想之间的一种桥梁。

游标的缺点

游标的主要缺点是性能不高。游标的开销与游标中进行的操作相关,如果在游标中进行复杂的操作,开销会非常高。

游标的适用场景

MySQL数据库中,可以在存储过程、函数、触发器、事件中使用游标。

使用步骤

  1. 定义游标:Declare 游标名称 CURSOR for table;(table也可以是select出来的结果集)
  2. 打开游标:Open 游标名称;
  3. 从结果集获取数据到变量:fetch 游标名称 into field1,field2;
  4. 执行语句:执行需要处理数据的语句
  5. 关闭游标:Close 游标名称;

示例



DELIMITER //
CREATE PROCEDURE  Proc_ProcessClassInfo(in classUid varchar(36))
BEGIN
  /* 定义变量*/
   DECLARE courseUid VARCHAR(36);

   # 声明游标结束变量
   DECLARE done INT DEFAULT 0;
  /* 声明游标*/
	DECLARE cur_list CURSOR FOR SELECT CourseUid  FROM class_course WHERE ClassUid=classUid;
	/*游标中的内容执行完后将done设置为1 */
  DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
	SET courseUid='';
	/* 打开游标 */
  OPEN cur_list;
	/* 执行循环 */
  read_loop : LOOP
	      /* 取游标中的值*/
        FETCH cur_list INTO courseUid;
				/* 判断是否结束循环,一定要放到FETCH之后,因为在fetch不到的时候才会设置done为1
         如果放到fetch之前,先判断done,这个时候done的值还是之前的循环的值,因此就会导致循环一次*/
        IF done THEN
            LEAVE read_loop;
        END IF;
				/*指定课件学习进度100%的内容*/
				CALL Proc_ProcessCourseComplete(courseUid);
				
	END LOOP read_loop;
  /* 释放游标 */
  CLOSE cur_list;
END 
//
DELIMITER ;

变量声明Declare需要注意的地方:

  • Declare声明本地变量必须放在最前列
  • Declare一般是先声明本地变量,再是游标,然后是条件和handler
  • Declare声明的本地变量名称与声明的游标名称不能相同



转载请注明:清风亦平凡 » MySQL存储过程中使用游标

]]>
https://www.mlplus.net/2021/08/28/mysql-cursor/feed/ 0
Mysql脚本实现行转列 https://www.mlplus.net/2021/08/09/mysql-row-to-column/ https://www.mlplus.net/2021/08/09/mysql-row-to-column/#respond Mon, 09 Aug 2021 08:09:43 +0000 https://www.mlplus.net/?p=3612 背景

某项目数据统计,为了更加直观显示一些数据,刚好有这个行转列的一个需求。行转列的需求其实在平常业务中也是比较常见的,在数据统计中使用的比较频繁。行转列以前也遇到过,之前数据库使用的是Microsoft SQL Server。目前使用的是MySQL数据库,这里也做一下简单的记录。

实现

结构与数据准备

为了更好的理解行转列,这里准备一张结构简单都表以及数据。


DROP TABLE IF EXISTS `project_completion_rate`;

CREATE TABLE `project_completion_rate` (
  `id` int(8) NOT NULL,
  `project_user` varchar(20) DEFAULT NULL,
  `project_content` varchar(20) DEFAULT NULL,
  `project_rate` int(8) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;


insert  into `project_completion_rate`(`id`,`project_user`,`project_content`,`project_rate`) values 
(1,'张三','机器人设计',80),
(2,'张三','图像识别',70),
(3,'张三','虚拟化技术',90),
(4,'张三','CPU设计',60),
(5,'李四','机器人设计',95),
(6,'李四','图像识别',96),
(7,'李四','虚拟化技术',97),
(8,'李四','CPU设计',99),
(9,'王五','机器人设计',100),
(10,'王五','虚拟化技术',100);

原始数据示例展示

Mysql脚本实现行转列-第0张图片

固定行转列

当需要行转列的项比较少且显示项数目无频繁变动的时候,可以使用以下方式实现行转列的需求。如果行转列的项变动频繁或者项比较多,此种方式实现行转列就不适合。



SELECT project_user AS '项目人员'
	    ,Max(CASE  WHEN p.project_content='CPU设计' THEN p.project_rate ELSE 0 END) AS  'CPU设计'
	    ,Max(CASE  WHEN p.project_content='图像识别' THEN p.project_rate ELSE 0 END) AS  '图像识别'
	    ,Max(CASE  WHEN p.project_content='机器人设计' THEN p.project_rate ELSE 0 END) AS  '机器人设计'
         ,Max(CASE  WHEN p.project_content='虚拟化技术' THEN p.project_rate ELSE 0 END) AS  '虚拟化技术'
FROM project_completion_rate p GROUP BY p.project_user;

动态行转列

动态行转列的实现方式,是为了解决行转列中的项变动频繁或者项比较多的时候而出现的。不固定的项的行转列就可以使用以下方式尝试完成。


-- 动态行转列脚本实现
SET @sql = NULL;
SELECT
 GROUP_CONCAT(DISTINCT
  CONCAT(
   'Max(IF(p.project_content = ''',
   p.project_content,
   ''', p.project_rate, 0)) AS ''',
   p.project_content, ''''
  )
 ) INTO @sql
FROM project_completion_rate p;
 
SET @sql = CONCAT('Select project_user AS ''项目人员'',', @sql, 
            ' From project_completion_rate p Group by p.project_user' );
						
PREPARE stmt FROM @sql;  -- 动态生成脚本
EXECUTE stmt;            -- 动态执行脚本
DEALLOCATE PREPARE stmt; -- 释放

最终结果展示

Mysql脚本实现行转列-第1张图片

结语

无论是SQL Server,还是MySQL,其实现行转列的方式也是比较多的。其中Mysql可以实现的方式都包括但不仅限于以上内容。



转载请注明:清风亦平凡 » Mysql脚本实现行转列

]]>
https://www.mlplus.net/2021/08/09/mysql-row-to-column/feed/ 0
Microsoft SQL Server跨服务器查询 https://www.mlplus.net/2021/05/23/microsoft-sql-server-remote-query/ https://www.mlplus.net/2021/05/23/microsoft-sql-server-remote-query/#respond Sun, 23 May 2021 01:00:00 +0000 https://www.mlplus.net/?p=3501 创建链接服务器

sp_addlinkedserver

创建链接服务器。 链接服务器让用户可以对 OLE DB 数据源进行分布式异类查询。 使用 sp_addlinkedserver 创建链接服务器后,可对该服务器运行分布式查询。 如果链接服务器定义为 SQL Server实例,则可执行远程存储过程。

语法


sp_addlinkedserver [ @server= ] 'server' [ , [ @srvproduct= ] 'product_name' ]   
     [ , [ @provider= ] 'provider_name' ]  
     [ , [ @datasrc= ] 'data_source' ]   
     [ , [ @location= ] 'location' ]   
     [ , [ @provstr= ] 'provider_string' ]   
     [ , [ @catalog= ] 'catalog' ]

参数

[ @server =] ‘ 服务器 ‘
要创建的链接服务器的名称。 server 的数据类型为 sysname,无默认值。

[ @srvproduct =] ‘ product_name ‘
要添加为链接服务器的 OLE DB 数据源的产品名称。 product_name 为 nvarchar ( 128 ),默认值为 NULL。 如果不需要指定 SQL Server、 provider_name、 data_source、 位置、 provider_string 和 目录 。

[ @provider =] ‘ provider_name ‘
与此数据源对应的 OLE DB 访问接口的唯一编程标识符 (PROGID)。 对于当前计算机上安装的指定 OLE DB 提供程序, provider_name 必须是唯一的。 provider_name 为 nvarchar (128),默认值为 NULL;但是,如果省略 provider_name ,则使用 sqlncli.msi。

使用 SQLNCLI.MSI 将重定向 SQL Server 到 SQL Server Native Client OLE DB 提供程序的最新版本。 OLE DB 提供程序应以指定的 PROGID 在注册表中注册。

以前的 Microsoft OLE DB Provider for SQL Server (SQLOLEDB) 和 SQL Server Native Client OLEDB 提供程序 (SQLNCLI) 仍然不推荐使用,不建议在新的开发工作中使用它们。 相反,请使用新的 Microsoft OLE DB Driver for SQL Server (MSOLEDBSQL),其将使用最新的服务器功能进行更新。

[ @datasrc =] ‘ data_source ‘
由 OLE DB 访问接口解释的数据源的名称。 data_source (4000 ) 为 nvarchar。 data_source 作为 DBPROP_INIT_DATASOURCE 属性传递以初始化 OLE DB 提供程序。

[ @location =] ‘ 位置 ‘
由 OLE DB 访问接口解释的数据库的位置。 location (4000 ) 为 NVARCHAR,默认值为 NULL。 location 作为 DBPROP_INIT_LOCATION 属性传递以初始化 OLE DB 提供程序。

[ @provstr =] ‘ provider_string ‘
OLE DB 访问接口特定的连接字符串,它可标识唯一的数据源。 provider_string 为 nvarchar ( 4000 ),默认值为 NULL。 provstr 传递给 IDataInitialize,或设置为 DBPROP_INIT_PROVIDERSTRING 属性以初始化 OLE DB 提供程序。

当针对 SQL Server Native Client OLE DB 提供程序创建链接服务器时,可以通过使用 server 关键字 as server =servername \ instancename 指定的特定实例来指定实例 SQL Server 。 servername 是运行的计算机的名称 SQL Server , instancename 是 SQL Server 用户将连接到的特定实例的名称。

若要访问镜像数据库,则连接字符串必须包含数据库名称。 该名称是数据访问接口启用故障转移尝试所必需的。 可以在 @ provstr 或 @ catalog 参数中指定数据库。 此外,连接字符串还可以提供故障转移伙伴名称。

返回代码值

0(成功)或 1(失败)

sp_addlinkedsrvlogin

创建或更新 SQL Server 本地实例上的登录名与远程服务器中安全帐户之间的映射。

语法


sp_addlinkedsrvlogin [ @rmtsrvname = ] 'rmtsrvname'   
     [ , [ @useself = ] { 'TRUE' | 'FALSE' | NULL } ]   
     [ , [ @locallogin = ] 'locallogin' ]   
     [ , [ @rmtuser = ] 'rmtuser' ]   
     [ , [ @rmtpassword = ] 'rmtpassword' ]

参数

[ @rmtsrvname = ] 'rmtsrvname'
应用登录映射的链接服务器的名称。 rmtsrvname 的值为 sysname,无默认值。

[ @useself = ] { 'TRUE' | 'FALSE' | NULL }'
确定是通过模拟本地登录名连接到 rmtsrvname ,还是显式提交登录名和密码。 数据类型为 varchar ( 8 ),默认值为 TRUE。

如果值为 TRUE,则指定登录名使用其自己的凭据连接到 rmtsrvname,并忽略 rmtuser 和 rmtpassword 参数。 FALSE 指定 rmtuser 和 rmtpassword 参数用于连接到指定 locallogin 的 rmtsrvname 。 如果将 rmtuser 和 RMTPASSWORD 设置为 NULL,则不会使用登录名或密码连接到链接服务器。

[ @locallogin = ] 'locallogin'
本地服务器上的登录。 locallogin 的值为 sysname,默认值为 NULL。 NULL 指定此条目适用于连接到 rmtsrvname 的所有本地登录名。 如果不为 NULL,则 locallogin 可以为 SQL Server 登录名或 Windows 登录名。 对于 Windows 登录来说,必须以直接的方式或通过已被授权访问的 Windows 组成员身份授予其访问 SQL Server 的权限。

[ @rmtuser = ] 'rmtuser'
当为 FALSE 时,用于连接到 rmtsrvname 的远程登录名 @useself 。 当远程服务器是 SQL Server 不使用 Windows 身份验证的实例时, rmtuser 是一个 SQL Server 登录名。 rmtuser 的值为 sysname,默认值为 NULL。

[ @rmtpassword = ] 'rmtpassword'
与 rmtuser 关联的密码。 rmtpassword 的值为 sysname,默认值为 NULL。

返回代码值

0(成功)或 1(失败)

sp_droplinkedsrvlogin 

删除运行 SQL Server 的本地服务器上的登录与链接服务器上的登录之间的现有映射。

语法


sp_droplinkedsrvlogin [ @rmtsrvname= ] 'rmtsrvname' ,   
   [ @locallogin= ] 'locallogin'

参数

[ @rmtsrvname = ] 'rmtsrvname' 应用登录映射的链接服务器的名称 SQL Server 。 rmtsrvname 的值为 sysname,无默认值。 rmtsrvname 必须已存在。

[ @locallogin = ] 'locallogin'SQL Server本地服务器上的登录名,它具有到链接服务器的映射 rmtsrvname。 locallogin 的值为 sysname,无默认值。 必须已经存在 locallogin 到 rmtsrvname 的映射。 如果为 NULL,则会删除 sp_addlinkedserver 创建的默认映射,该映射将本地服务器上的所有登录名映射到链接服务器上的登录名。

返回代码值

0(成功)或 1(失败)

sp_dropserver 

从本地 SQL Server 实例中的已知远程服务器和链接服务器的列表中删除服务器。

语法


sp_dropserver [ @server = ] 'server'   
     [ , [ @droplogins = ] { 'droplogins' | NULL} ]

参数

服务器
要删除的服务器。 server 的数据类型为 sysname,无默认值。 服务器 必须存在。

droplogins
指示如果指定了 droplogins ,则还必须删除 服务器 的相关远程服务器和链接服务器登录名。 @droplogins 为 char (10),默认值为 NULL。

返回代码值

0(成功)或 1(失败)

示例

Microsoft SQL Server跨服务器查询-第0张图片

异地服务器, 数据库之间的查询

创建链接服务器


EXEC sp_addlinkedserver
@server = 'SourceHost', -- 目标服务器别名
@srvproduct = 'MSSQL',  -- 产品名称
@datasrc = '192.168.0.132\MSSQLSERVER2012' , -- 目标服务器名称
@provider = 'SQLOLEDB'

登录链接服务器


EXEC sp_addlinkedsrvlogin
@rmtsrvname = 'SourceHost' , -- 与以上 @server 同名
@useself = 'false' ,
@locallogin = NULL ,
@rmtuser = 'sa' ,
@rmtpassword = '123'

删除登录与链接服务器的映射


--删除登录与链接服务器的映射
exec sp_droplinkedsrvlogin  @rmtsrvname= 'SourceHost' ,   
    @locallogin= 'locallogin'  

删除链接服务器


--删除链接服务器 
exec sp_dropserver 'SourceHost', 'droplogins'

查询异地服务器的目标数据库


select * from SourceHost.目标数据库名称.dbo.表名



转载请注明:清风亦平凡 » Microsoft SQL Server跨服务器查询

]]>
https://www.mlplus.net/2021/05/23/microsoft-sql-server-remote-query/feed/ 0
.NET 使用MySql 8.0报caching_sha2_password错误的问题处理 https://www.mlplus.net/2020/10/05/net-mysql-caching_sha2_password-error/ https://www.mlplus.net/2020/10/05/net-mysql-caching_sha2_password-error/#respond Mon, 05 Oct 2020 13:41:04 +0000 https://www.mlplus.net/?p=3224 背景

接手别人项目进行维护,使用Mysql 8.0 数据库正确还原,但是项目却无法启动,经过调试发现以下问题。

MySqlException Authentication method ‘caching_sha2_password’ not supported by any of the available plugins。

.NET 使用MySql 8.0报caching_sha2_password错误的问题处理-第0张图片

通常的报这个错误是因为它的身份验证方式是 mysql_native_password ,不是caching_sha2_password导致。

Mysql 官方相关资料:https://dev.mysql.com/doc/refman/8.0/en/caching-sha2-pluggable-authentication.html

解决方法

首先找到MySql 8.0 的安装目录,看一下是否存在my.ini配置文件,默认安装路径如下:

C:\Program Files\MySQL\MySQL Server 8.0

.NET 使用MySql 8.0报caching_sha2_password错误的问题处理-第1张图片

现在并没有发现my.ini配置文件,经过了解Mysql 8.0 安装后会将配置相关内容保存在以下目录中:

C:\ProgramData\MySQL\MySQL Server 8.0

.NET 使用MySql 8.0报caching_sha2_password错误的问题处理-第2张图片

打开my.ini配置文件并找到caching_sha2_password所在的行。

.NET 使用MySql 8.0报caching_sha2_password错误的问题处理-第3张图片

default_authentication_plugin=caching_sha2_password替换为default_authentication_plugin=mysql_native_password

.NET 使用MySql 8.0报caching_sha2_password错误的问题处理-第4张图片

操作完成后保存,然后重启mysql 8.0服务即可。



转载请注明:清风亦平凡 » .NET 使用MySql 8.0报caching_sha2_password错误的问题处理

]]>
https://www.mlplus.net/2020/10/05/net-mysql-caching_sha2_password-error/feed/ 0
MySQL新增/修改/删除表中的列 https://www.mlplus.net/2020/03/31/mysqloperationcolumn/ https://www.mlplus.net/2020/03/31/mysqloperationcolumn/#respond Tue, 31 Mar 2020 05:00:00 +0000 https://www.mlplus.net/?p=2621 MySQL新增/修改/删除表中的列-第0张图片

因业务需求可能会导致数据存储结构发生变化,当数据保存到关系型数据库中时必将带来表结构的变化,这就涉及到对表中的列进行新增、修改、删除等操作。

在大多情况下数据库脚本执行必须是可重复的,因此对数据库表的任何表变动都需要进行判断,然而在MySQL数据库中通过SQL脚本进行列的变更就不太便利。下面记录一下曾经用到的一些MySQL脚本:


USE DATABASE NAME; -- 这里要换数据库名称
DROP PROCEDURE IF EXISTS Operate_ColumnADD_Update_Delete;
DELIMITER$$
-- 1表示新增列,2表示修改列类型,3表示删除列
CREATE PROCEDURE Operate_ColumnADD_Update_Delete(TableName VARCHAR(50),ColumnName VARCHAR(50),SqlStr VARCHAR(4000),CType INT)
BEGIN
DECLARE Rows1 INT;
SET Rows1=0;
SELECT COUNT(*) INTO Rows1  FROM INFORMATION_SCHEMA.Columns
WHERE table_schema= DATABASE() AND table_name=TableName AND column_name=ColumnName;
-- 新增列
IF (CType=1 AND Rows1<=0) THEN
SET SqlStr := CONCAT( 'ALTER TABLE ',TableName,' ADD COLUMN ',ColumnName,' ',SqlStr);
-- 修改列类型
ELSEIF (CType=2 AND Rows1>0)  THEN
SET SqlStr := CONCAT('ALTER TABLE ',TableName,' MODIFY  ',ColumnName,' ',SqlStr);
-- 删除列
ELSEIF (CType=3 AND Rows1>0) THEN
SET SqlStr := CONCAT('ALTER TABLE  ',TableName,' DROP COLUMN  ',ColumnName);
ELSE  SET SqlStr :='';
END IF;
-- 执行命令
IF (SqlStr<>'') THEN 
SET @SQL1 = SqlStr;
PREPARE stmt1 FROM @SQL1;
EXECUTE stmt1;
END IF;
END$$
DELIMITER ;

调用示例


CALL Pro_Temp_ColumnWork ('course_learning','UserUid','VARCHAR(36);', 1);
CALL Pro_Temp_ColumnWork ('course_exam','Grade','double(10, 2) NOT NULL DEFAULT 0.00;', 1);
DROP PROCEDURE IF EXISTS Pro_Temp_ColumnWork;
因为MySQL数据库的版本或者工具问题,可能会出现提示语法错误的情况。本博使用的是Navicat Premium 15



转载请注明:清风亦平凡 » MySQL新增/修改/删除表中的列

]]>
https://www.mlplus.net/2020/03/31/mysqloperationcolumn/feed/ 0
Host is not allowed to connect to this MySQL server问题 https://www.mlplus.net/2019/09/06/hostisnotallowedtoconnecttothismysql/ https://www.mlplus.net/2019/09/06/hostisnotallowedtoconnecttothismysql/#respond Fri, 06 Sep 2019 01:00:55 +0000 https://www.mlplus.net/?p=1845 在应用部署后访问中出现一下错误:

ERROR 1130: Host ‘localhost’ is not allowed to connect to this MySQL server

其实就是 MySQL 不允许当前的Host进行连接。为了本地以后测试方便,暴力解决方法如下:

  • 1.在装有MySQL的机器上登录MySQL:mysql -uroot -p密码
  • 2.选择我mysql库,执行use mysql;
  • 3.更新user表,执行update user set host = ‘%’ where user = ‘root’;这一句执行完可能会报错,不用管它。
  • 4.执行FLUSH PRIVILEGES;

Host is not allowed to connect to this MySQL server问题-第0张图片



转载请注明:清风亦平凡 » Host is not allowed to connect to this MySQL server问题

]]>
https://www.mlplus.net/2019/09/06/hostisnotallowedtoconnecttothismysql/feed/ 0
自增长INT主键与GUID主键优缺点 https://www.mlplus.net/2016/09/23/keyintorguid/ https://www.mlplus.net/2016/09/23/keyintorguid/#respond Fri, 23 Sep 2016 01:16:00 +0000 https://www.mlplus.net/?p=2339 使用INT做主键的优点:
  • 需要很小的数据存储空间,仅仅需要4 byte 。
  • insert和update操作时使用INT的性能比GUID好,所以使用int将会提高应用程序的性能。
  • index和Join 操作,int的性能最好。
  • 容易记忆。
  • 支持通过函数获取最新的值

使用INT做主键的缺点

  • 如果经常有合并表的操作,就可能会出现主键重复的情况。
  • 使用INT数据范围有限制。如果存在大量的数据,可能会超出INT的取值范围。
  • 很难处理分布式存储的数据表。

使用GUID做主键的优点:

  • 它是独一无二的。
  • 出现重复的机会少。
  • 适合大量数据中的插入和更新操作。
  • 跨服务器数据合并非常方便。

使用GUID做主键的缺点:

  • 存储空间大(16 byte),因此它将会占用更多的磁盘大小。
  • 很难记忆。join操作性能比int要低。
  • 没有内置的函数获取最新产生的guid主键。
  • GUID做主键将会添加到表上的所以其他索引中,因此会降低性能。



转载请注明:清风亦平凡 » 自增长INT主键与GUID主键优缺点

]]>
https://www.mlplus.net/2016/09/23/keyintorguid/feed/ 0
数据库事物四大特性 https://www.mlplus.net/2016/04/10/databasefourattribute/ https://www.mlplus.net/2016/04/10/databasefourattribute/#respond Sun, 10 Apr 2016 01:10:38 +0000 https://www.mlplus.net/?p=1440

数据库中事务的四大特性(ACID):原子性、一致性、隔离性、持久性。如果一个数据库支持事务的操作,那么该数据库必须要具备以下四个特性:

原子性(Atomicity)

原子性是指事务包含的所有操作要么全部成功,要么全部失败回滚,这和前面两篇博客介绍事务的功能是一样的概念,因此事务的操作如果成功就必须要完全应用到数据库,如果操作失败则不能对数据库有任何影响。

一致性(Consistency)

一致性是指事务必须使数据库从一个一致性状态变换到另一个一致性状态,也就是说一个事务执行之前和执行之后都必须处于一致性状态。

隔离性(Isolation)

隔离性是当多个用户并发访问数据库时,比如操作同一张表时,数据库为每一个用户开启的事务,不能被其他事务的操作所干扰,多个并发事务之间要相互隔离。

持久性(Durability)

持久性是指一个事务一旦被提交了,那么对数据库中的数据的改变就是永久性的,即便是在数据库系统遇到故障的情况下也不会丢失提交事务的操作。



转载请注明:清风亦平凡 » 数据库事物四大特性

]]>
https://www.mlplus.net/2016/04/10/databasefourattribute/feed/ 0
Sql Server 中关闭/取消ID自增字段 https://www.mlplus.net/2012/04/10/sqlserver-identity-insert/ https://www.mlplus.net/2012/04/10/sqlserver-identity-insert/#respond Tue, 10 Apr 2012 01:21:00 +0000 https://www.mlplus.net/?p=1995 在数据库进行表设计的时,大多情况下都习惯使用一个自增列作为主键,具体原因这里不会进行描述。在很多情况下需要对现有数据进行数据迁移,这个时候就需要保证迁移后的数据自增列的数据保持不变。SQL SERVER是支持这种迁移方式的。

首先就要先取消自增长,数据迁移完成后再恢复自增长即可。

SET IDENTITY_INSERT

允许将显式值插入表的标识列中。

语法
SET IDENTITY_INSERT [ database.[ owner.] ] { table } { ON | OFF }

实例


set IDENTITY_INSERT tableName on; 
INSERT INTO   tableName  (id,name) VALUES (2,'name');
set IDENTITY_INSERT  tableName  off; 



转载请注明:清风亦平凡 » Sql Server 中关闭/取消ID自增字段

]]>
https://www.mlplus.net/2012/04/10/sqlserver-identity-insert/feed/ 0