MySql – 清风亦平凡 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
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
.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