1: mysql 相关按照包下载和使用
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默认密码,知道原来的密码: 或者密码过期了要 修改,注意新密码和之前的不能是一样的
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管理端口开放到外网,具体修复方式参见
7: mysql定时任务?
mysql开启定时任务或者时间Event有没有开启
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;导入另外一个用户 就会出问题;
-------------------------------------------------------------------------------------
-------------------------------------------------
更新的同时查询同一张表,保存:
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
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