mysql相关知识汇总学习

1: mysql 相关按照包下载和使用

mysql zip版本的安装和配置

Navicat for MySQL macOS  x

Navicat Premium 12 for Mac 12.0.23 开发版本 x

Navicat Premium开发版 V12.0.11.0永久使用 for windows x

2: 关于mysql字符集说明,解决不能保存表情问题

字符集说明: 参加:字节、字、bit、byte的关系;  ;;      

mysql7字符集:utf8mb4、 排序方式: utf8mb4_unicode_ci

The utf8mb4 Character Set (4-Byte UTF-8 Unicode Encoding)

utf8mb4 字符集(4字节 UTF-8 Unicode 编码)

大部分项目使用“utfm4_general_ci”就够了,如果你的项目要支持 “德语、法语或者俄语”,请使用:“utf8mb4_unicode_ci”

3: 关于mysql密码相关

新安装的mysql没有设置密码,错误1045

修改mysql默认密码,知道原来的密码: 或者密码过期了要 修改,注意新密码和之前的不能是一样的

mysql修改密码:
mysql7之前: 
-- update mysql.user set password=PASSWORD('imega') where  User='imega';  
-- flush privileges;

mysql7之后:mysql5.7的mysql.user表下为什么没有password字段了,改成了authentication_string字段。
update MySQL.user set authentication_string=password('imega') where user='imega';
flush privileges;


-- 查看所有的用户 、 修改 原来的用户名称
select user,host from mysql.user;
update user set user ='ourslook' where user ='cyl';


--- mysql5.7 查看和修改密码过期 策略
show global variables like 'default_password_lifetime';  -- 一般默认180天
SET GLOBAL default_password_lifetime = 0; --- 设置是0,就是永远不过期

-- 更厉害的是全局设置一下
[mysqld]
default_password_lifetime=0

4:mysql函数相关

&-1:比如把所有用户昵称为空的人,昵称全部变成手机号中间带有四位****

UPDATE tb_xa_user SET  user_name =  concat(SUBSTR(mobile,1,3),'****',SUBSTR(mobile, -4)) WHERE length(user_name) = 0

&-2:把集合变成逗号分割的形式,经常在子查询

DELETE FROM sys_menu menu WHERE
  menu.menu_id in  (
                    (SELECT GROUP_CONCAT(a.menu_id) FROM sys_menu a LEFT JOIN sys_menu b on a.parent_id = b.menu_id WHERE a.type = 2 and b.menu_id is NULL)
                  ) ;
select t1.* , group_concat(t2.role_id) roleIdList from sys_user t1
		left join sys_user_role t2 on t2.user_id = t1.user_id
  group by t1.user_id;-- 结果:13,26,29,1,12,27,28,30

&-3: 字符串连接函数

select concat('11','22',null); 结果是<null>

select concat_ws(',','11','22','33'); 结果:11,22,33

&-4:IFNULL

SELECT o.create_time,IFNULL(o.price,0),'1' TYPE FROM tb_xa_charge_reward o

&-5:日期处理函数:

SELECT o.pay_time,ifnull(o.order_price,0) * (userRules/100),'1' type FROM tb_xa_order o where o.order_status=5 and DATE_FORMAT(o.pay_time,'%Y-%m-%d')<DATE_FORMAT(DATE_ADD(now(),INTERVAL -30 day),'%Y-%m-%d') and o.business_id=userId

DATE_FORMAT: 处理时间格式最常用:

%Y-%m-%d 四位年2位月2位天

DATE_ADD 或者 DATE_SUB :日期操作详解:

set @dt = now();

select date_add(@dt, interval 1 day); -- add 1 day 增加一天
select date_add(@dt, interval 1 hour); -- add 1 hour 增加一小时
select date_add(@dt, interval 1 minute); -- ...
select date_add(@dt, interval 1 second);
select date_add(@dt, interval 1 microsecond);
select date_add(@dt, interval 1 week);
select date_add(@dt, interval 1 month);
select date_add(@dt, interval 1 quarter);
select date_add(@dt, interval 1 year);

select date_add(@dt, interval -1 day); -- sub 1 day 减少一天;  也可以直接使用 date_sub

&-6:大小写函数、union all、ordrby rand()、存储过程

CREATE PROCEDURE `pro_home_search`(`searchKey` VARCHAR(255), `begins` INT(11), `counts` INT(11)) COMMENT '首页多模块搜索'
  SELECT id, name, type, typeName FROM (
  SELECT id AS id , title                AS name, 1  as type, '服务公共' as typeName FROM tb_xa_service_common  WHERE  status <> 3 AND (UPPER(title) LIKE searchKey OR LOWER(title) LIKE searchKey)
    UNION ALL
  SELECT id AS id , nurse_name         AS name, 12 as type, '家政护理' as typeName  FROM tb_xa_domesticnursing  WHERE  status <> 3  AND  (UPPER(nurse_name) LIKE searchKey OR LOWER(nurse_name) LIKE searchKey)
    UNION ALL
  SELECT id AS id , merchant_name        AS name, 13 as type, '医疗服务|医疗康复' as typeName  FROM tb_xa_medicalservice  WHERE  status <> 3 AND  (UPPER(merchant_name) LIKE searchKey OR LOWER(merchant_name) LIKE searchKey)
    UNION ALL
  SELECT id AS id , nurse_training_name  AS name, 14 as type, '护理培训|培训义工' as typeName  FROM tb_xa_nursetraining  WHERE  status <> 3 AND  (UPPER(nurse_training_name) LIKE searchKey OR LOWER(nurse_training_name) LIKE searchKey)
    UNION ALL
  SELECT id AS id , vsdc_name            AS name, 15 as type, '义工中心' as typeName  FROM tb_xa_vsdc  WHERE  status <> 3 AND  (UPPER(vsdc_name) LIKE searchKey OR LOWER(vsdc_name) LIKE searchKey)
    UNION ALL
  SELECT id AS id , institution_name     AS name, 2  as type, '机构' as typeName  FROM tb_xa_institution  WHERE  status <> 3 AND  (UPPER(institution_name) LIKE searchKey OR LOWER(institution_name) LIKE searchKey)
    UNION ALL
  SELECT id AS id , hotel_rooms_name     AS name, 22 as type, '机构养老院' as typeName  FROM tb_xa_inshotelroomstable  WHERE  status <> 3 AND  (UPPER(hotel_rooms_name) LIKE searchKey OR LOWER(hotel_rooms_name) LIKE searchKey)
   UNION ALL
  SELECT id AS id , shop_product_name    AS name, 3  as type, '普通商品' as typeName  FROM tb_xa_shop  WHERE  status = 2 AND  (UPPER(shop_product_name) LIKE searchKey OR LOWER(shop_product_name) LIKE searchKey)
   UNION ALL
  SELECT id AS id , works_name           AS name, 4 as type, '艺术品' as typeName  FROM tb_xa_autherworkstable  WHERE status <> 3  AND  (UPPER(works_name) LIKE searchKey OR LOWER(works_name) LIKE searchKey)
    UNION ALL
  SELECT id AS id , author_name          AS name, 42 as type,'作者' as typeName  FROM tb_xa_artinformation  WHERE  status <> 3 AND  (UPPER(author_name) LIKE searchKey  OR LOWER(author_name) LIKE searchKey)
    UNION ALL
  SELECT id AS id , travel_item_name     AS name, 5 as type, '游学|旅游' as typeName  FROM tb_xa_traveltable  WHERE  status <> 3 AND  (UPPER(travel_item_name) LIKE searchKey OR LOWER(travel_item_name) LIKE searchKey)
) RESULT
ORDER BY rand() LIMIT begins, counts

&-7:union 使用,连接多张表:

CREATE PROCEDURE pro_gains(IN userId BIGINT, IN b INT, IN c INT)
  BEGIN
	-- 变量,经销商返点规则
	DECLARE userRules int DEFAULT 0;
	-- 查询返点规则和账期给对应变量
	select s.user_rules into userRules from tb_xa_setting s where s.id=1;
	SELECT * from
		(SELECT rs.create_time,o.order_price * (userRules/100),'2' type from tb_xa_returnshoprecord rs INNER JOIN tb_xa_order o on rs.order_no=o.order_no where o.business_id=userId and rs.audit_result=1 and o.order_status=8
				UNION
		 SELECT c.create_time,c.cash_money,'3' type from tb_xa_cashrecord c where c.audit_result=1 and c.user_id=userId
				UNION
		SELECT o.pay_time,ifnull(o.order_price,0) * (userRules/100),'1' type FROM tb_xa_order o where o.order_status=5 and DATE_FORMAT(o.pay_time,'%Y-%m-%d')<DATE_FORMAT(DATE_ADD(now(),INTERVAL -30 day),'%Y-%m-%d') and o.business_id=userId
			  UNION
		SELECT o.create_time,IFNULL(o.price,0),'1' TYPE FROM tb_xa_charge_reward o WHERE o.business_id=userId and o.create_user IS NULL  and o.price IS NOT NULL and o.price<>0
			  UNION
		SELECT o.create_time,IFNULL(o.price,0),'4' TYPE FROM tb_xa_charge_reward o WHERE o.business_id=userId and o.create_user IS NOT NULL  and o.price IS NOT NULL and o.price<>0
) t ORDER BY t.create_time desc limit b,c;
end;

&-8:replace函数的坑,如果 替换后的字符串是 null, 会清空该字段

UPDATE tb_token set token = REPLACE(token,'0', null); #输入的话,第二个参数如何是null的话, 本条数据就全丢失了。
UPDATE tb_token set token = REPLACE(token,'旧的字符串', IFNULL('新的字符串', '')); #输入的话,第二个参数如何是null的话, 本条数据就全丢失了。

MySQL 如何利用一条语句实现类似于if-else条件语句的判断

-- 商品价格浮动处理,不同价格区间浮动不同
update goods  
set price = (  
case   
  when price between 0 and 99 then price * 1.2  
  when price between 100 and 999 then price * 1.1  
  when price between 1000 and 1999 then price * 1.05  
  when price > 1999 then price * 1.02  
end);  
select * from goods;


-- 根据成绩显示对应的中文
select id as 学号, name as 姓名, score as 分数,   
(  
  case   
    when score >= 90 then '优秀'  
    when score >= 80 and score < 90 then '良好'  
    when score >= 60 and score < 80 then '及格'  
    when score < 60 then '不及格'  
  end  
)  
as 等级  
from scores;

5: mysql 导入导出 ,用户名称不一样导致的问题

mysql数据导出然后导入导致报错:

java.sql.SQLException: The user specified as a definer ('exiaodao'@'%') does not exist

原因是修改了数据库访问的用户,存储过程,视图,函数的definer改变了,导致访问不了

手工用navicat修改一下definer

6: mysql服务器密码安全策略

  【阿里云】尊敬的阿里云用户:

云盾检测到您云服务器106.14.66.218自建的Mysql数据库存在弱口令问题,可能会造成数据被删勒索或数据泄露的风险,请您尽快修改密码并建议您不要将Mysql管理端口开放到外网,具体修复方式参见

Mysql服务安全加固 阿里云

MySQL中用户权限、库权限、表权限的控制
 

7: mysql定时任务?

mysql开启定时任务或者时间Event有没有开启

1:如何设置

2:怎么开启

SHOW VARIABLES LIKE 'event_scheduler'

8: mysql 卡死、 密码过期、连接数问题解决

mysql表被锁定、卡死、锁死

-- 查看所有进程
show processlist;
-- 分析sql查询锁的使用情况介绍
select * from information_schema.innodb_trx;

-- 查询是否锁表
show OPEN TABLES where In_use > 0;

-- 查看被锁住的
SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCKS; 
-- 等待锁定
SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCK_WAITS; 
kill 12041;
kill   id  ;

mysql过期策略-MySQL的用户密码过期功能详解 x

expire password policy : default(默认) 、immediate(立即) 、interval( 间隔)、never(绝不)
EXPIRE INTERVAL 30 DAY; 间隔时间30
EXPIRE NEVER; 禁用密码过期
EXPIRE DEFAULT;默认策略密码过期

mysql连接情况,http://blog.csdn.net/wsf568582678/article/details/53636747

-- Mysql 查看连接数,状态 最大并发数(赞)
show variables like '%max_connections%';-- 查看最大连接数
show status like 'Threads%'; -- Threads_running是代表当前并发数;Threads_connected这个数值指的是打开的连接数;
show status; -- 显示数据库的状态
show processlist; --查看具体的连接情况 

-------------------------------------------------------------------------------------------------------------------------------------------------------------------------

mysql创建索引技巧,索引长度不能太长,否则报错,如:Specified key was too long; max key length is 767 bytes;

下面修改之后,如果还不起作用,请参考博客:https://blog.csdn.net/hanyunpiaoyu/article/details/82377897  x

-- mysql创建索引技巧,索引长度不能太长,否则报错,如:Specified key was too long; max key length is 767 bytes
-- 使用utf8mb4 一个字符使用4个字节,varchar(200) = 200 * 4 = 800 bytes,就超过了。
-- 查看索引相关的长度和和格式
show variables like 'innodb_large_prefix';   -- 正常取值ON,不正常取值OFF
show variables like 'innodb_file_format';-- 正常取值:Barracuda,不正常取值:Antelope

-- 修改最大索引长度限制
set global innodb_large_prefix=1; 
set global innodb_file_format=BARRACUDA;
-- 添加
set global innodb_file_format_max=BARRACUDA;

-------------------------------------------------------------------------------------

mysql导入导出可能出现的问题

1:索引长度过长,比如utf8mb4字符集,varchar(191.75),最大长度只能191,否则有问题

2: 线上已经有数据的表,比如数据有1万条,添加表的索引、改变表的长度等alter 行为,都很慢;解决方法:表数据导出备份、清空数据、然后在修改表结构、重新导入数据;

3:导入导出,如果是有函数、存储过程等,并且两个数据库的用户名还不一样,到时也会出现问题;

     比如:表开始用root用户创建,那这个函数的创建者就是root;导入另外一个用户 就会出问题;

-------------------------------------------------------------------------------------

Mysql索引详解及优化(key和index区别)

-------------------------------------------------

更新的同时查询同一张表,保存:

You can't specify target table '表名' for update in FROM clause错误(不能在同一个sql语句中,先select同一个表的某些值,然后再update这个表)

https://blog.csdn.net/h996666/article/details/81699255

------------------------------------------------------

mysql忘记密码CentOS7下mysql忘记root密码的处理方法xxx

参考:CentOS7下mysql忘记root密码的处理方法

9: mysql创建数据库并给授予最低权限

-- -- 删除用户和授权
-- drop user wanjieuser@'%';

-- 创建用户、设置默认数据库、修改密码过期策略;密码要包含大小写数组特殊字符等,否则不符合安全策略
CREATE USER 'hunqinguser'@'%' IDENTIFIED BY 'hunqing123X_..';
create database `hunqingdb` DEFAULT CHARSET utf8mb4 COLLATE utf8mb4_unicode_ci;

-- 授权 SELECT VERSION();
-- mysql5.7、5.6 以及以下授权
-- 这里可以授权多个db的权限
grant all privileges on `hunqingdb`.* to 'hunqinguser'@'%' identified by 'hunqing123X_..';
-- mysql8+ 授权;   mysql8的密码机制有改动,授权完毕,需要在更改奶一下密码。
-- grant all privileges on `hunqingdb`.* to 'hunqinguser'@'%' ;
-- ALTER USER 'hunqinguser'@'localhost' IDENTIFIED WITH mysql_native_password BY 'hunqing123X_..';


flush privileges;
 
-- 如果给ourslookPortaluser分配所有表的权限,ourslookdb 变成 *.*

查看数据库:show databases;
查看用户已经权限: SELECT DISTINCT CONCAT('User: ''',user,'''@''',host,''';') AS query FROM mysql.user;

10: mysql表字符集不一致的问题

      mysql如果字符集不一致,导致问题

      1: 关联表索引失效

      2:不同版本mysql,有的版本mysql字符集不存在,导致 表迁移失败等。

      这里提供统一的修改表字符集的方法

     

-- 1:这里修改所有表的字符集
select CONCAT('alter table ',a.table_name,' convert to character set utf8mb4 collate utf8mb4_unicode_ci;')
from (select table_name from information_schema.`TABLES` where TABLE_SCHEMA = '您要替换的mysql数据库名称,其他的可以都不用修改') a;

-- 2:当然光修改了表的字符集,如果表字段字符集不一致也可能有问题。
-- 见博客: mysql 批量修改 表字段/表/数据库 字符集和排序规则  https://www.cnblogs.com/-renyu/p/10776020.html     可以使用
-- 这里修改所有的表字段字符集  指定数据库名称 和 不是主键 不是 int类型
SELECT *, TABLE_SCHEMA '数据库',TABLE_NAME '表',COLUMN_NAME '字段',CHARACTER_SET_NAME '原字符集',COLLATION_NAME '原排序规则',CONCAT('ALTER TABLE ', TABLE_SCHEMA,'.',TABLE_NAME, ' MODIFY COLUMN `',COLUMN_NAME,'` ',COLUMN_TYPE,' CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;') '修正SQL'
FROM information_schema.`COLUMNS` 
WHERE TABLE_SCHEMA  =  'hiberdb' and column_key != 'PRI' and character_set_name is not null;

mysql 批量修改 表字段/表/数据库 字符集和排序规则 <亲测客户使用>,如果是创建新的数据库参见(搜字符集)    Linux centos 安装软件  xx

发布了112 篇原创文章 · 获赞 85 · 访问量 33万+

猜你喜欢

转载自blog.csdn.net/ab601026460/article/details/54017607