MySQL使用问题

Oracle转MySQL

https://github.com/Snailclimb/JavaGuide/blob/master/docs/database/%E4%B8%80%E5%8D%83%E8%A1%8CMySQL%E5%91%BD%E4%BB%A4.md

切换MySQL需要换方言,需要对自定义函数进行注册,否则hql中无法使用自定义函数:

public class UseMySQL57Dialect extends MySQL57Dialect {
	public UseMySQL57Dialect() {
		super();
		registerHibernateType(Types.NULL, StandardBasicTypes.STRING.getName());
		/**
		 * 函数名必须是小写,试验大写出错 
		 * SQLFunctionTemplate函数第一个参数是函数的输出类型,
		 * varchar对应StandardBasicTypes.STRING 
		 * ?1代表第一个参数,?2代表第二个参数,所以写成my_bpm_task(?1,?2,?3,?4,?5,?6)
		 */
		registerFunction("my_bpm_task", 
                         new SQLFunctionTemplate(StandardBasicTypes.STRING, 		                              "my_bpm_task(?1,?2,?3,?4,?5,?6)"));
		registerFunction("fun_get_shuliang", 
                         new SQLFunctionTemplate(StandardBasicTypes.INTEGER,                                      "fun_get_shuliang(?1,?2)"));
		registerFunction("money_to_chinese", 
                         new SQLFunctionTemplate(StandardBasicTypes.STRING,                                        "money_to_chinese(?1)"));
	}
}

一、数据类型

在使用UTF8字符集的时候,MySQL手册上是这样描述的:

  • 基本拉丁字母、数字和标点符号使用一个字节;
  • 大多数的欧洲和中东手写字母适合两个字节序列:扩展的拉丁字母(包括发音符号、长音符号、重音符号、低音符号和其它音符)、西里尔字母、希腊语、亚美尼亚语、希伯来语、阿拉伯语、叙利亚语和其它语言;
  • 韩语、中文和日本象形文字使用三个字节序列。

1.1 整值类型

  1. 整型
数据类型范围说明
TINYINT(m)1个字节 范围(-128~127)MySQL没有布尔型,常用TINYINT(1)表示布尔型,1表示true,0表示false
SMALLINT(m)2个字节 范围(-32768~32767)
MEDIUMINT(m)3个字节 范围(-8388608~8388607)
INT(m)4个字节 范围(-2147483648~2147483647)
BIGINT(m)8个字节 范围(±9.22*10的18次方)
  1. 浮点型
数据类型范围说明
FLOAT(m,d)单精度浮点型 8位精度(4字节) m总个数,d小数位
DOUBLE(m,d)双精度浮点型 16位精度(8字节) m总个数,d小数位
  1. 定点数
数据类型说明
DECIMAL(M, D)M也表示总位数,D表示小数位数。保存一个精确的数值,不会发生数据的改变,不同于浮点数的四舍五入。将浮点数转换为字符串来保存,每9位数字保存为4个字节。

1.2 字符串类型

类型范围说明
char(m)m表示能存储的最大长度,此长度是字符数,非字节数。最多255个字符,与编码无关。定长字符串,速度快,必须在括号里定义长度,自动用空格填充,且在检索的时候后面的空格会隐藏掉,所以检索出来的数据需要记得用trim之类的函数去过滤空格。
varchar(m)m表示能存储的最大长度,此长度是字符数,非字节数。最多65535字符,与编码有关。utf8 最大为21844个字符,gbk 最大为32766个字符,latin1 最大为65532个字符必须在括号里定义长度,不进行空格自动填充。varchar保存数据时第一个字节是空的,不存在任何数据,另外如果数据小于255个字节,则采用一个字节来保存长度,反之需要两个字节来保存。
text非二进制字符串(字符字符串)。不需要定义长度,也不会计算总长度。
blob二进制字符串(字节字符串),类似如text
binary二进制字符串(字节字符串),类似如char
varbinary二进制字符串(字节字符串),类似如varchar

1.3 日期时间类型

类型大小说明范围
datetime8字节日期及时间:
YYYY-MM-DD hh:mm:ss
1000-01-01 00:00:00 到 9999-12-31 23:59:59
date3字节日期:
YYYY-MM-DD
YY-MM-DD
YYYYMMDD
YYMMDD
YYYYMMDD
YYMMDD
1000-01-01 到 9999-12-31
timestamp4字节时间戳:
YY-MM-DD hh:mm:ss
YYYYMMDDhhmmss
YYMMDDhhmmss
YYYYMMDDhhmms
YYMMDDhhmmss
19700101000000 到 2038-01-19 03:14:07
time3字节时间:
hh:mm:ss
hhmmss
hhmmss
-838:59:59 到 838:59:59
year1字节年份:
YYYY
YY
1901 - 2155

二、Mysql常用函数

2.1 数学函数

abs(x)                  	-- 返回x的绝对值
bin(x)                  	-- 返回x的二进制(oct返回八进制,hex返回十六进制)
ceiling(x)              	-- 返回大于x的最小整数值
exp(x)                  	-- 返回值e(自然对数的底)的x次方
floor(x)                	-- 返回小于x的最大整数值
greatest(x1,x2,...,xn)  	-- 返回集合中最大的值
least(x1,x2,...,xn)     	-- 返回集合中最小的值
ln(x)                   	-- 返回x的自然对数
log(x,y)                	-- 返回x的以y为底的对数
mod(x,y)                	-- 返回x/y的模(余数)
pi()                    	-- 返回pi的值(圆周率)
rand()                  	-- 返回0到1内的随机值,可以通过提供一个参数(种子)使rand()随机数生成器生成一个指定的值。
round(x,y)              	-- 返回参数x的四舍五入的有y位小数的值
sign(x)                 	-- 返回代表数字x的符号的值
sqrt(x)                 	-- 返回一个数的平方根
truncate(x,y)           	-- 返回数字x截短为y位小数的结果

2.2 字符串函数

ascii(char) 				-- 返回字符的ascii码值
bit_length(str) 			-- 返回字符串的比特长度
concat(s1,s2...,sn) 		-- 将s1,s2...,sn连接成字符串
concat_ws(sep,s1,s2...,sn)  -- 将s1,s2...,sn连接成字符串,并用sep字符间隔
insert(str,x,y,instr)   	-- 将字符串str从第x位置开始,y个字符长的子串替换为字符串instr,返回结果
find_in_set(str,list)   	-- 分析逗号分隔的list列表,如果发现str,返回str在list中的位置
lcase(str)/lower(str) 		-- 返回将字符串str中所有字符改变为小写后的结果
left(str,x) 				-- 返回字符串str中最左边的x个字符
length(s)   				-- 返回字符串str中的字符数
ltrim(str)  				-- 从字符串str中切掉开头的空格
position(substr,str)    	-- 返回子串substr在字符串str中第一次出现的位置
quote(str)  				-- 用反斜杠转义str中的单引号
repeat(str,srchstr,rplcstr) -- 返回字符串str重复x次的结果
reverse(str) 				-- 返回颠倒字符串str的结果
right(str,x) 				-- 返回字符串str中最右边的x个字符
rtrim(str) 					-- 返回字符串str尾部的空格
strcmp(s1,s2)   			-- 比较字符串s1和s2
trim(str)   				-- 去除字符串首部和尾部的所有空格
ucase(str)/upper(str) 		-- 返回将字符串str中所有字符转变为大写后的结果

2.3 日期和时间函数

now()  						 -- 返回当前的日期和时间 2020-05-22 23:05:16
curdate()或current_date() 	-- 返回当前的日期 2020-05-22
curtime()或current_time() 	-- 返回当前的时间 23:07:28
date_add(date,interval int keyword)  -- 返回日期date加上间隔时间int的结果(int必须按照关键字进行格式化),如:selectdate_add(current_date,interval 6 month);
date_format(date,fmt)  		-- 依照指定的fmt格式格式化日期date值
date_sub(date,interval int keyword)  -- 返回日期date加上间隔时间int的结果(int必须按照关键字进行格式化),如:select date_sub(current_date,interval 6 month);
dayofweek(date)   			-- 返回date所代表的一星期中的第几天(1~7)
dayofmonth(date)  			-- 返回date是一个月的第几天(1~31)
dayofyear(date)   			-- 返回date是一年的第几天(1~366)
dayname(date)   			-- 返回date的星期名,如:select dayname(current_date);
from_unixtime(ts,fmt)  		-- 根据指定的fmt格式,格式化unix时间戳ts
hour(time)   				-- 返回time的小时值(0~23)
minute(time)   				-- 返回time的分钟值(0~59)
month(date)   				-- 返回date的月份值(1~12)
monthname(date)   			-- 返回date的月份名,如:select monthname(current_date);
quarter(date)   			-- 返回date在一年中的季度(1~4),如select quarter(current_date);
week(date)   				-- 返回日期date为一年中第几周(0~53)
year(date)   				-- 返回日期date的年份(1000~9999)

2.4 聚合函数(常用于group by从句的select查询中)

avg(col)     				-- 返回指定列的平均值
count(col)   				-- 返回指定列中非null值的个数
min(col)     				-- 返回指定列的最小值
max(col)     				-- 返回指定列的最大值
sum(col)     				-- 返回指定列的所有值之和
group_concat(col) 			-- 返回由属于一组的列值连接组合而成的结果

2.5 加密函数

aes_encrypt(str,key)  		-- 返回用密钥key对字符串str利用高级加密标准算法加密后的结果,调用aes_encrypt的结果是一个二进制字符串,以blob类型存储
aes_decrypt(str,key)  		-- 返回用密钥key对字符串str利用高级加密标准算法解密后的结果
decode(str,key)   			-- 使用key作为密钥解密加密字符串str
encrypt(str,salt)   		-- 使用unixcrypt()函数,用关键词salt(一个可以惟一确定口令的字符串,就像钥匙一样)加密字符串str
encode(str,key)   			-- 使用key作为密钥加密字符串str,调用encode()的结果是一个二进制字符串,它以blob类型存储
md5()    					-- 计算字符串str的md5校验和
password(str)   			-- 返回字符串str的加密版本,这个加密过程是不可逆转的,和unix密码加密过程使用不同的算法。
sha()    					-- 计算字符串str的安全散列算法(sha)校验和

2.6 格式化函数

-- 其中最简单的是format()函数,它可以把大的数值格式化为以逗号间隔的易读的序列。
date_format(date,fmt)       -- 依照字符串fmt格式化日期date值
format(x,y)                 -- 把x格式化为以逗号隔开的数字序列,y是结果的小数位数
inet_aton(ip)   			-- 返回ip地址的数字表示
inet_ntoa(num)   			-- 返回数字所代表的ip地址
time_format(time,fmt)  		-- 依照字符串fmt格式化时间time值

三、Oracle函数变换MySQL函数

3.1 decode:条件判断

-- oracle
decode(sign( s.comp_yxq - DATE_FORMAT( NOW(), '%Y-%m-%d' )), -1, 1, 0)
-- mysql
CASE sign( s.comp_yxq - DATE_FORMAT( NOW(), '%Y-%m-%d' )) WHEN - 1 THEN 1 ELSE 0 END

3.2 wm_concat:行转列功能

即将查询出的某一列值使用逗号进行隔开拼接,成为一条数据。

-- oracle
SELECT wm_concat( b.yw_lx || ':' || b.zw_id ) FROM sys_user_zhiwu b
-- mysql
SELECT GROUP_CONCAT( b.yw_lx , ':' , b.zw_id ) FROM sys_user_zhiwu b

3.3 trunc :时间转换

  1. 格式化时间:
-- oracle
trunc(sysdate,'dd')
-- mysql
DATE_FORMAT(NOW(),'%Y-%m-%d %H:%i:%s')
  1. 时间操作
-- oralce
select add_months(sysdate,-6) from dual;  -- 2019/11/7 9:36:22
-- mysql
SELECT ADDDATE(NOW(), INTERVAL -6 MONTH); -- 2019-11-07 09:36:22
SELECT ADDDATE(NOW(), INTERVAL -7 DAY);   -- 2020-04-30 09:41:13

3.4 null和空字符串

  • Oracle

    null等同于空字符’';

  • MySQL

    1. mysql插入null显示为null,插入空字符串显示空;
    2. 空字符串不占空间,null占空间

3.5 MySQL字符串的处理

3.5.1 字符串的拼接
  1. CONCAT(s1, s2, ...):返回连接参数产生的字符串,一个或多个待拼接的内容,任意一个为NULL则返回值为NULL
SELECT CONCAT('现在的时间:',NOW());  -- 输出结果:现在的时间:2020-04-28 11:27:58
  1. CONCAT_WS(x, s1, s2, ...):返回多个字符串拼接之后的字符串,每个字符串之间有一个x
SELECT CONCAT_WS(';','A','b','C'); -- 输出结果:A;b;C
3.5.2 字符串的截取
  1. SUBSTRING(s, n, len)MID(s, n, len)函数:两个函数作用相同,从字符串s中返回一个第n个字符开始、长度为len的字符串。
SELECT SUBSTRING('您好,欢迎使用MySQL',8,14); 
SELECT MID('您好,欢迎使用MySQL',8,14);       
  1. LEFT(s, n)RIGHT(s, n)函数:前者返回字符串s从最左边开始的n个字符,后者返回字符串s从最右边开始的n个字符。
SELECT LEFT('您好,欢迎使用MySQL',7);   
SELECT RIGHT('您好,欢迎使用MySQL',14);
3.5.3 字符串与数字
  1. 直接在字符串后面+0
select '1111' + 0; -- 1111
  1. CAST(value AS type)
select cast('33333' as SIGNED INTEGER); -- 33333
select cast('33333.333' as decimal(10,3)); -- 33333.333
  1. CONVERT(value, type)
SELECT CONVERT('33333',SIGNED); --  33333
SELECT CONVERT('33333.333',decimal(10,3)); -- 33333.333

四、其他语句

4.1 查询所有表的行数

use information_schema;
select table_name,table_rows from tables where TABLE_SCHEMA = "数据库名称" order by table_rows asc;

4.2 获取所有表的视图脚本

use information_schema;
select t.table_name,t.table_comment,
CONCAT('create or replace view v_yzb_' , lower(t.table_name) , ' as select * from zjyzb.' , lower(t.table_name) , ';')
from TABLES t where t.TABLE_SCHEMA='zjyzb' and t.table_comment <> ''
order by t.table_name;

五、函数、存储过程、触发器

5.1 declare声明

begin 
   -- 定义变量,必须声明在begin...end块的最前面
	DECLARE taskKey varchar(50);
	set taskKey := 0;
end

Establishing SSL connection without server’s identity verification is not recommended. According to MySQL 5.5.45+, 5.6.26+ and 5.7.6+ requirements SSL connection must be established by default if explicit option isn’t set. For compliance with existing applications not using SSL the verifyServerCertificate property is set to ‘false’. You need either to explicitly disable SSL by setting useSSL=false, or set useSSL=true and provide truststore for server certificate verification.

5.2 存储过程异常处理

https://www.cnblogs.com/geaozhang/p/6814567.html

  • 定义异常处理

  • 单一异常处理程序

    continue

    exit

  • 多个异常处理程序

    ​ 关于错误编号和SQLSTATE

    ​ 使用3个处理程序

    ​ 忽略某一异常处理

  • 异常处理的命名

  • 异常传播

5.2.1 定义异常处理

DECLARE ... HANDLER语句:

DECLARE handler_action HANDLER
    FOR condition_value [, condition_value] ...
    statement

handler_action:
    CONTINUE | EXIT

condition_value:
    mysql_error_code
    | SQLSTATE [VALUE] sqlstate_value
    | condition_name
    | SQLWARNING
    | NOT FOUND
    | SQLEXCEPTION

注意:declare……handler语句必须出现在变量或条件声明的后面

当某个错误(condition_value)发生时—>执行指定的语句(statement–记录错误信息),执行完之后再决定如何操作(handler_action)。

  1. handler_action

    continue:继续执行当前的程序(接着执行出错的SQL的下一条语句);

exit:当前程序终止(退出当前declare所在的begin end);

  1. statement

    可以是单条语句或复合语句。

六、批量修改字段名为大小写

6.1 大写

-- 大写 ucase()
SELECT
concat( 'alter table `', TABLE_NAME, '` change column `', COLUMN_NAME, '` `', UCASE( COLUMN_NAME ), '` ', COLUMN_TYPE, ' comment ''', COLUMN_COMMENT, ''';' ) AS 修改脚本
FROM
information_schema.COLUMNS
WHERE
TABLE_SCHEMA = 'zjcas'

6.2 小写

-- 小写 LOWER()
SELECT
concat( 'alter table `', TABLE_NAME, '` change column `', COLUMN_NAME, '` `', LOWER( COLUMN_NAME ), '` ', COLUMN_TYPE, ' comment ''', COLUMN_COMMENT, ''';' ) AS 修改脚本
FROM
information_schema.COLUMNS
WHERE
TABLE_SCHEMA = 'zjcas'

6.3 批量修改字段类型

SELECT
   CONCAT('ALTER TABLE ', TABLE_NAME,' MODIFY COLUMN ', column_name, ' int(1) DEFAULT 0;'),
	 column_name,
	 TABLE_NAME,
    DATA_TYPE,
    column_comment
FROM
    information_schema. COLUMNS
WHERE
    TABLE_SCHEMA = 'zjcas'
		AND DATA_TYPE = 'decimal'
 order by TABLE_NAME;
 

七、批量删除外键(流程ACT表需要执行)

use information_schema;
SELECT CONCAT('ALTER TABLE ',TABLE_SCHEMA,'.',TABLE_NAME,' DROP FOREIGN KEY ',CONSTRAINT_NAME,' ;') 
FROM information_schema.TABLE_CONSTRAINTS c 
WHERE c.TABLE_SCHEMA='zjyzb' AND c.CONSTRAINT_TYPE='FOREIGN KEY';

八、查询时不区分大小写

  1. _ci结尾表示大小写不敏感(caseinsensitive),_cs表示大小写敏感(case sensitive),_bin表示二进制的比较(binary)

  2. 5.6版本的mysql,对于这个版本是不支持utf8的cs排序规则,如果要想对大小写敏感,可以使用_bin的排序规则

-- 对于已经创建好的表,可以是用如下命令进行修改(修改表结构的Collation属性):
ALTER TABLE TABLENAME MODIFY COLUMN COLUMNNAME VARCHAR(50) BINARY CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL;
-- 修改表的字符集和所有列的字符集
ALTER TABLE tableName CONVERT TO CHARACTER SET utf8 COLLATE utf8_bin;
-- 修改库的排序规则(执行后已有表未改变,新建表有效)
ALTER DATABASE zjcas CHARACTER SET utf8 COLLATE utf8_bin;

九、批量修改字段

-- 修改字段类型
select 'alter table '||a.TABLE_NAME||' modify '||a.COLUMN_NAME||' VARCHAR2('|| a.CHAR_COL_DECL_LENGTH||');' 
from all_tab_columns a
where a.DATA_TYPE='NVARCHAR2' --指定字段类型
and a.TABLE_NAME=upper('sh_jdjc_detail_zj') ;

-- 新增数据项
select 'alter table '||a.TABLE_NAME||' add tp_'||a.COLUMN_NAME||' VARCHAR2('|| a.CHAR_COL_DECL_LENGTH||');' 
from all_tab_columns a
where a.DATA_TYPE='NCLOB' --指定字段类型
and a.TABLE_NAME=upper('sh_jdjc_element_zj') ;
-- 删除旧数据项
select 'alter table '||a.TABLE_NAME||' drop column '||a.COLUMN_NAME||';' 
from all_tab_columns a
where a.DATA_TYPE='NCLOB' --指定字段类型
and a.TABLE_NAME=upper('sh_jdjc_element_zj') ;
-- 修改数据项名称
select 'alter table '||a.TABLE_NAME||' rename column '||a.COLUMN_NAME||' to ' ||substr(a.COLUMN_NAME, 4) ||';' 
from all_tab_columns a
where a.COLUMN_NAME like 'TP_%'
and a.TABLE_NAME=upper('sh_jdjc_element_zj') ;
-- 修改默认值
alter table 表名 alter column 字段名 set default 默认值;

十、批量修改表名


SELECT
   CONCAT('ALTER TABLE ',TABLE_NAME,' RENAME ', UCASE(TABLE_NAME), ';')
FROM
    information_schema. TABLES
WHERE
    TABLE_SCHEMA = 'zjcas' AND TABLE_TYPE='BASE TABLE' ORDER BY TABLE_NAME;
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值