一、MySQL系统内置函数
1、字符串函数
conv(n,from_base,to_base)
对数字n进制转换,并转换为字串返回(任何参数为null时返回null,进制范围为2-36进制,当to_base是负数时n作为有符号数否则作无符号数,conv以64位点精度工作)
SELECT CONV(10,10,2),CONV('1010',2,10)
locate(substr,str) position(substr in str)
返回字符串substr在字符串str第一次出现的位置(str不包含substr时返回0)
SELECT LOCATE('1','abcd1e1fg'),POSITION('1' IN 'abcd1e1fg')
locate(substr,str,pos)
返回字符串substr在字符串str的第pos个位置起第一次出现的位置(str不包含substr时返回0)
SELECT LOCATE('1','abcd1e1fg',6),LOCATE('1','abcd1e1fg',7),LOCATE('1','abcd1e1fg',8)
instr(str,substr)
返回字符串substr在字符串str第一次出现的位置(str不包含substr时返回0)
SELECT INSTR('abcd1e1fg','1'),INSTR('abcd1e1fg','h');
lpad(str,len,padstr)
用字符串padstr填补str左端直到字串长度为len并返回
rpad(str,len,padstr)
用字符串padstr填补str右端直到字串长度为len并返回
SELECT LPAD('A',6,'X'),RPAD('A',6,'X')
left(str,len)
返回字符串str的左端len个字符
right(str,len)
返回字符串str的右端len个字符
SELECT LEFT('foobarbar', 4),RIGHT('foobarbar', 4);
substring(str,pos,len)
mid(str,pos,len)
返回字符串str的位置pos起len个字符
substring_index(str,delim,count)
返回从字符串str的第count个出现的分隔符delim之后的子串(count为正数时返回左端,否则返回右端子串)
SELECT SUBSTRING('www.mysql.com', 2, 4),MID('www.mysql.com', 3, 2),SUBSTRING_INDEX('www.mysql.com', '.', 2);
ltrim(str)
返回删除了左空格的字符串str
rtrim(str)
返回删除了右空格的字符串str
trim([[both | leading | trailing] [remstr] from] str)
返回前缀或后缀remstr被删除了的字符串str(位置参数默认both,remstr默认值为空格)
SELECT LTRIM(' foob'),RTRIM('foob '),TRIM(LEADING 'fo' FROM 'foob'),TRIM(TRAILING 'ob' FROM 'foob'),TRIM( 'o' FROM 'ofo');
space(n)
返回由n个空格字符组成的一个字符串
SELECT SPACE(5)
replace(str,from_str,to_str)
用字符串to_str替换字符串str中的子串from_str并返回
repeat(str,count)
返回由count个字符串str连成的一个字符串(任何参数为null时
返回null,count<=0时返回一个空字符串)
reverse(str)
颠倒字符串str的字符顺序并返回
insert(str,pos,len,newstr)
把字符串str由位置pos起len个字符长的子串替换为字符串
elt(n,str1,str2,str3,...)
返回第n个字符串(n小于1或大于参数个数返回null)
field(str,str1,str2,str3,...)
返回str等于其后的第n个字符串的序号(如果str没找到返回0)
find_in_set(str,strlist)
返回str在字符串集strlist中的序号(任何参数是null则返回null,如果str没找到返回0,参数1包含","时工作异常)
lcase(str)
lower(str)
返回小写的字符串str
ucase(str)
upper(str)
返回大写的字符串str
2、数学函数
mod(n,m)
取模运算,返回n被m除的余数(同%操作符)
floor(n)
返回不大于n的最大整数值
ceiling(n)
返回不小于n的最小整数值
round(n,d)
返回n的四舍五入值,保留d位小数(d的默认值为0)
pow(x,y)
power(x,y)
返回值x的y次幂
rand()
rand(n)
返回在范围0到1.0内的随机浮点值(可以使用数字n作为初始值)
rand()产生的最小是0,最大是1,如果需要生成指定范围的随机数,可以通过rand()*(y-x)+x可以生成[x,y]的随机数。
mysql> select rand()*(62-1)+1 from dual;
+-------------------+
| rand()*(62-1)+1 |
+-------------------+
| 32.29352378313758 |
+-------------------+
least(x,y,...)
返回最小值(如果返回值被用在整数(实数或大小敏感字串)上下文或所有参数都是整数(实数或大小敏感字串)则他们作为整数(实数或大小敏感字串)比较,否则按忽略大小写的字符串被比较)
greatest(x,y,...)
返回最大值(其余同least())
3、时期时间函数
dayofmonth(date)
返回date是一月中的第几日(在1到31范围内)
dayofyear(date)
返回date是一年中的第几日(在1到366范围内)
year(date)
返回date的年份(范围在1000到9999)
month(date)
返回date中的月份数值
hour(time)
返回time的小时数(范围是0到23)
minute(time)
返回time的分钟数(范围是0到59)
second(time)
返回time的秒数(范围是0到59)
dayname(date)
返回date是星期几(按英文名返回)
monthname(date)
返回date是几月(按英文名返回)
unix_timestamp(date)
返回一个unix时间戳(从'1970-01-01 00:00:00'gmt开始的秒数,date默认值为当前时间)
from_unixtime(unix_timestamp)
以'yyyy-mm-dd hh:mm:ss'或yyyymmddhhmmss格式返回时间戳的值(根据返回值所处上下文是字符串或数字)
MYSQL中UNIX时间戳与日期的转换 FROM_UNIXTIME(),UNIX_TIMESTAMP();
SELECT FROM_UNIXTIME(1344887103,'%Y-%m-%d %h:%i:%s'),UNIX_TIMESTAMP('2012-08-14 03:45:03') FROM DUAL;
TO_DAYS(FROM_UNIXTIME(tbl_playerdata.GameStartTime)) = TO_DAYS(NOW()) 就是我们判断是不是同一天
date_add(date,interval expr type)
函数向日期添加指定的时间间隔,type可选的范围MICROSECOND,SECOND,MINUTE,HOUR,DAY,WEEK,MONTH,QUARTER,YEAR,SECOND_MICROSECOND,MINUTE_MICROSECOND,
MINUTE_SECOND,HOUR_MICROSECOND,HOUR_SECOND,HOUR_MINUTE,DAY_MICROSECOND,DAY_SECOND,DAY_MINUTE,DAY_HOUR,YEAR_MONTH
mysql> select now(),date_add(now(),interval -10 year),date_add(now(),interval -10 month),date_add(now(),interval -10 hour),date_add(now(),interval -10 minute);
+---------------------+-----------------------------------+------------------------------------+-----------------------------------+-------------------------------------+
| now() | date_add(now(),interval -10 year) | date_add(now(),interval -10 month) | date_add(now(),interval -10 hour) | date_add(now(),interval -10 minute) |
+---------------------+-----------------------------------+------------------------------------+-----------------------------------+-------------------------------------+
| 2017-12-11 16:11:31 | 2007-12-11 16:11:31 | 2017-02-11 16:11:31 | 2017-12-11 06:11:31 | 2017-12-11 16:01:31 |
+---------------------+-----------------------------------+------------------------------------+-----------------------------------+-------------------------------------+
1 row in set (0.00 sec)
mysql格式化日期
mysql查询记录如果有时间戳字段时,查看结果不方便,不能即时看到时间戳代表的含义,现提供mysql格式换时间函数,可以方便的看到格式化后的时间。
DATE_FORMAT() 函数用于以不同的格式显示日期/时间数据。
DATE_FORMAT(date,format) format参数的格式有
%a | 缩写星期名 |
%b | 缩写月名 |
%c | 月,数值 |
%D | 带有英文前缀的月中的天 |
%d | 月的天,数值(00-31) |
%e | 月的天,数值(0-31) |
%f | 微秒 |
%H | 小时 (00-23) |
%h | 小时 (01-12) |
%I | 小时 (01-12) |
%i | 分钟,数值(00-59) |
%j | 年的天 (001-366) |
%k | 小时 (0-23) |
%l | 小时 (1-12) |
%M | 月名 |
%m | 月,数值(00-12) |
%p | AM 或 PM |
%r | 时间,12-小时(hh:mm:ss AM 或 PM) |
%S | 秒(00-59) |
%s | 秒(00-59) |
%T | 时间, 24-小时 (hh:mm:ss) |
%U | 周 (00-53) 星期日是一周的第一天 |
%u | 周 (00-53) 星期一是一周的第一天 |
%V | 周 (01-53) 星期日是一周的第一天,与 %X 使用 |
%v | 周 (01-53) 星期一是一周的第一天,与 %x 使用 |
%W | 星期名 |
%w | 周的天 (0=星期日, 6=星期六) |
%X | 年,其中的星期日是周的第一天,4 位,与 %V 使用 |
%x | 年,其中的星期一是周的第一天,4 位,与 %v 使用 |
%Y | 年,4 位 |
%y | 年,2 位 |
CONCAT(str1,str2,…)
str1,str2...如有任何一个为NULL ,则返回值为 NULL
SELECT CONCAT('11','22','333',NULL),CONCAT('11','22','333','');
MySQL中concat_ws函数
CONCAT_WS(separator,str1,str2,...)
CONCAT_WS() 代表 CONCAT With Separator ,是CONCAT()的特殊形式。第一个参数是其它参数的分隔符。分隔符的位置放在要连接的两个字符串之间。分隔符可以是一个字符串,也可以是其它参数。
如果分隔符为 NULL,则结果为 NULL。函数会忽略任何分隔符参数后的 NULL 值。
SELECT CONCAT_WS('||','A','b'),CONCAT_WS(';','A','b'),CONCAT_WS(',','A','b'),CONCAT_WS(NULL,'A','b'),CONCAT_WS('-','A','b',NULL)
MySQL中group_concat函数
group_concat([DISTINCT] 要连接的字段 [Order BY ASC/DESC 排序字段] [Separator '分隔符']),默认使用","分割
SELECT plant_code,attr1_name, GROUP_CONCAT(ATTR1_CONTENT),GROUP_CONCAT(ATTR1_CONTENT SEPARATOR ';'),
GROUP_CONCAT(DISTINCT ATTR1_CONTENT SEPARATOR ';'),GROUP_CONCAT(DISTINCT ATTR1_CONTENT ORDER BY ATTR1_CONTENT DESC SEPARATOR ';')
FROM rep_channeng_chanzhi GROUP BY plant_code,attr1_name;
一、数学函数
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位小数的结果
二、聚合函数(常用于GROUP BY从句的SELECT查询中)
AVG(col)返回指定列的平均值
COUNT(col)返回指定列中非NULL值的个数
MIN(col)返回指定列的最小值
MAX(col)返回指定列的最大值
SUM(col)返回指定列的所有值之和
GROUP_CONCAT(col) 返回由属于一组的列值连接组合而成的结果
三、字符串函数
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中所有字符转变为大写后的结果
四、日期和时间函数
CURDATE()或CURRENT_DATE() 返回当前的日期
CURTIME()或CURRENT_TIME() 返回当前的时间
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必须按照关键字进行格式化),如:SELECTDATE_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);
NOW() 返回当前的日期和时间
QUARTER(date) 返回date在一年中的季度(1~4),如SELECT QUARTER(CURRENT_DATE);
WEEK(date) 返回日期date为一年中第几周(0~53)
YEAR(date) 返回日期date的年份(1000~9999)
一些示例:
获取当前系统时间:SELECT FROM_UNIXTIME(UNIX_TIMESTAMP());
SELECT EXTRACT(YEAR_MONTH FROM CURRENT_DATE);
SELECT EXTRACT(DAY_SECOND FROM CURRENT_DATE);
SELECT EXTRACT(HOUR_MINUTE FROM CURRENT_DATE);
返回两个日期值之间的差值(月数):SELECT PERIOD_DIFF(200302,199802);
在Mysql中计算年龄:
SELECT DATE_FORMAT(FROM_DAYS(TO_DAYS(NOW())-TO_DAYS(birthday)),'%Y')+0 AS age FROM employee;
这样,如果Brithday是未来的年月日的话,计算结果为0。
下面的SQL语句计算员工的绝对年龄,即当Birthday是未来的日期时,将得到负值。
SELECT DATE_FORMAT(NOW(), '%Y') - DATE_FORMAT(birthday, '%Y') -(DATE_FORMAT(NOW(), '00-%m-%d') <DATE_FORMAT(birthday, '00-%m-%d')) AS age from employee
五、加密函数
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)校验和
示例:
SELECT ENCRYPT('root','salt');
SELECT ENCODE('xufeng','key');
SELECT DECODE(ENCODE('xufeng','key'),'key');#加解密放在一起
SELECT AES_ENCRYPT('root','key');
SELECT AES_DECRYPT(AES_ENCRYPT('root','key'),'key');
SELECT MD5('123456');
SELECT SHA('123456');
六、控制流函数
MySQL有4个函数是用来进行条件操作的,这些函数可以实现SQL的条件逻辑,允许开发者将一些应用程序业务逻辑转换到数据库后台。
MySQL控制流函数:
CASE WHEN[test1] THEN [result1]...ELSE [default] END如果testN是真,则返回resultN,否则返回default
CASE [test] WHEN[val1] THEN [result]...ELSE [default]END 如果test和valN相等,则返回resultN,否则返回default
IF(test,t,f) 如果test是真,返回t;否则返回f
IFNULL(arg1,arg2) 如果arg1不是空,返回arg1,否则返回arg2
NULLIF(arg1,arg2) 如果arg1=arg2返回NULL;否则返回arg1
这些函数的第一个是IFNULL(),它有两个参数,并且对第一个参数进行判断。如果第一个参数不是NULL,函数就会向调用者返回第一个参数;如果是NULL,将返回第二个参数。
如:SELECT IFNULL(1,2), IFNULL(NULL,10),IFNULL(4*NULL,'false');
NULLIF()函数将会检验提供的两个参数是否相等,如果相等,则返回NULL,如果不相等,就返回第一个参数。
如:SELECT NULLIF(1,1),NULLIF('A','B'),NULLIF(2+3,4+1);
和许多脚本语言提供的IF()函数一样,MySQL的IF()函数也可以建立一个简单的条件测试,这个函数有三个参数,第一个是要被判断的表达式,如果表达式为真,IF()将会返回第二个参数,如果为假,IF()将会返回第三个参数。
如:SELECTIF(1<10,2,3),IF(56>100,'true','false');
IF()函数在只有两种可能结果时才适合使用。然而,在现实世界中,我们可能发现在条件测试中会需要多个分支。在这种情况下,MySQL提供了CASE函数,它和PHP及Perl语言的switch-case条件例程一样。
CASE函数的格式有些复杂,通常如下所示:
CASE [expression to be evaluated]
WHEN [val 1] THEN [result 1]
WHEN [val 2] THEN [result 2]
WHEN [val 3] THEN [result 3]
......
WHEN [val n] THEN [result n]
ELSE [default result]
END
这里,第一个参数是要被判断的值或表达式,接下来的是一系列的WHEN-THEN块,每一块的第一个参数指定要比较的值,如果为真,就返回结果。所有的WHEN-THEN块将以ELSE块结束,当END结束了所有外部的CASE块时,如果前面的每一个块都不匹配就会返回ELSE块指定的默认结果。如果没有指定ELSE块,而且所有的WHEN-THEN比较都不是真,MySQL将会返回NULL。
CASE函数还有另外一种句法,有时使用起来非常方便,如下:
CASE
WHEN [conditional test 1] THEN [result 1]
WHEN [conditional test 2] THEN [result 2]
ELSE [default result]
END
这种条件下,返回的结果取决于相应的条件测试是否为真。
示例:
mysql>SELECT CASE 'green'
WHEN 'red' THEN 'stop'
WHEN 'green' THEN 'go' END;
SELECT CASE 9 WHEN 1 THEN 'a' WHEN 2 THEN 'b' ELSE 'N/A' END;
SELECT CASE WHEN (2+2)=4 THEN 'OK' WHEN(2+2)<>4 THEN 'not OK' END ASSTATUS;
SELECT Name,IF((IsActive = 1),'已激活','未激活') AS RESULT FROMUserLoginInfo;
SELECT fname,lname,(math+sci+lit) AS total,
CASE WHEN (math+sci+lit) < 50 THEN 'D'
WHEN (math+sci+lit) BETWEEN 50 AND 150 THEN 'C'
WHEN (math+sci+lit) BETWEEN 151 AND 250 THEN 'B'
ELSE 'A' END
AS grade FROM marks;
SELECT IF(ENCRYPT('sue','ts')=upass,'allow','deny') AS LoginResultFROM users WHERE uname = 'sue';#一个登陆验证
七、格式化函数
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值
其中最简单的是FORMAT()函数,它可以把大的数值格式化为以逗号间隔的易读的序列。
示例:
SELECT FORMAT(34234.34323432,3);
SELECT DATE_FORMAT(NOW(),'%W,%D %M %Y %r');
SELECT DATE_FORMAT(NOW(),'%Y-%m-%d');
SELECT DATE_FORMAT(19990330,'%Y-%m-%d');
SELECT DATE_FORMAT(NOW(),'%h:%i %p');
SELECT INET_ATON('10.122.89.47');
SELECT INET_NTOA(175790383);
八、类型转化函数
为了进行数据类型转化,MySQL提供了CAST()函数,它可以把一个值转化为指定的数据类型。类型有:BINARY,CHAR,DATE,TIME,DATETIME,SIGNED,UNSIGNED
示例:
SELECT CAST(NOW() AS SIGNED INTEGER),CURDATE()+0;
SELECT 'f'=BINARY 'F','f'=CAST('F' AS BINARY);
九、系统信息函数
DATABASE() 返回当前数据库名
BENCHMARK(count,expr) 将表达式expr重复运行count次
CONNECTION_ID() 返回当前客户的连接ID
FOUND_ROWS() 返回最后一个SELECT查询进行检索的总行数
USER()或SYSTEM_USER() 返回当前登陆用户名
VERSION() 返回MySQL服务器的版本
示例:
SELECT DATABASE(),VERSION(),USER();
SELECTBENCHMARK(9999999,LOG(RAND()*PI()));#该例中,MySQL计算LOG(RAND()*PI())表达式9999999次。
参考资料:
https://www.cnblogs.com/noway-neway/p/5211401.html
二、自定义函数
1、生成不长于指定长度的随机字符串
DELIMITER $$
DROP FUNCTION IF EXISTS rand_string;
create function rand_string (n int)
returns varchar(255)
begin
declare chars_str varchar(100) default 'abcdefghigklmnopqrstuvwxyzABCDEFGHIGKLMNOPQRSTUVWXYZ0123456789';
declare return_str varchar(255) default '';
declare i int default 0;
declare len int default round(rand()*(n-1)+1);
while i < len do
set return_str = concat(return_str,substring(chars_str,floor(1+rand()*61),1));
set i = i+1;
end while;
return return_str;
END $$
DELIMITER ;
mysql> select rand_string(10),rand_string(10),rand_string(10),rand_string(10),rand_string(10),rand_string(10) from dual;
+-----------------+-----------------+-----------------+-----------------+-----------------+-----------------+
| rand_string(10) | rand_string(10) | rand_string(10) | rand_string(10) | rand_string(10) | rand_string(10) |
+-----------------+-----------------+-----------------+-----------------+-----------------+-----------------+
| iGoKsQG | vtHUgEbL | o | 7C | NbgTm | EaIUgD7y |
+-----------------+-----------------+-----------------+-----------------+-----------------+-----------------+
1 row in set (0.01 sec)
2、生成指定长度的数字(长度可能会小于指定长度,还会生成复数)
DELIMITER $$
DROP FUNCTION IF EXISTS rand_num;
create function rand_num (n int)
returns bigint
begin
declare chars_str varchar(10) default '0123456789';
declare return_str varchar(20) default '';
declare i int default 0;
while (i < n) do
set return_str = concat(return_str,substring(chars_str,floor(1+rand()*10),1));
set i = i+1;
end while;
return CONVERT(return_str,SIGNED);
END $$
DELIMITER ;
mysql> select rand_num(19), rand_num(19), rand_num(19), rand_num(19), rand_num(19), rand_num(19), rand_num(19) from dual;
+---------------------+--------------------+--------------------+---------------------+----------------------+---------------------+---------------------+
| rand_num(19) | rand_num(19) | rand_num(19) | rand_num(19) | rand_num(19) | rand_num(19) | rand_num(19) |
+---------------------+--------------------+--------------------+---------------------+----------------------+---------------------+---------------------+
| 4290528645114873393 | 217425904319918717 | 964217362105970154 | 5278906016963946642 | -8448258569419175977 | 6244007806983211304 | 8936416584872902227 |
+---------------------+--------------------+--------------------+---------------------+----------------------+---------------------+---------------------+
1 row in set, 1 warning (0.00 sec)
3、生成指定范围内的日期时间随机值(传入天数)
DELIMITER $$
DROP FUNCTION IF EXISTS rand_datetime;
create function rand_datetime (n int)
returns datetime
begin
declare return_str datetime ;
set return_str = date_add(now(), interval -(rand()*(n-1)+1)*24*3600 second);
return return_str;
END $$
DELIMITER ;
mysql> select rand_datetime(3650),rand_datetime(3650),rand_datetime(3650),rand_datetime(3650),rand_datetime(3650),rand_datetime(3650) from dual;
+---------------------+---------------------+---------------------+---------------------+---------------------+---------------------+
| rand_datetime(3650) | rand_datetime(3650) | rand_datetime(3650) | rand_datetime(3650) | rand_datetime(3650) | rand_datetime(3650) |
+---------------------+---------------------+---------------------+---------------------+---------------------+---------------------+
| 2015-04-11 17:46:36 | 2015-12-07 02:07:38 | 2015-11-20 13:24:08 | 2013-09-10 20:43:30 | 2012-11-09 23:30:51 | 2015-04-06 15:29:29 |
+---------------------+---------------------+---------------------+---------------------+---------------------+---------------------+
1 row in set (0.00 sec)
在服务器上创建成功,但在SQLyog上仍然包1064错误。。。。。。。。。。
log_bin_trust_function_creators变量解释
在MySQL主从复制机器的master的数据库中创建function,报出如下错误:
ERROR 1418 (HY000): This function has none of DETERMINISTIC, NO SQL, or READS SQL DATA in its declaration and binary logging is enabled (you *might* want e the less safe log_bin_trust_function_creators variable)
原来是因为在主从复制的两台MySQL服务器中开启了二进制日志选项log-bin,slave会从master复制数据,而一些操作,比如function所得的结果在master和slave上可能不同,所以存在潜在的安全隐患。因此,在默认情况下回阻止function的创建。
有两种办法来解决这一问题
1.将log_bin_trust_function_creators参数设置为ON,这样一来开启了log-bin的MySQL Server便可以随意创建function。这里存在潜在的数据安全问题,除非明确的知道创建的function在master和slave上的行为完全一致。
设置该参数可以用动态的方式或者指定该参数来启动数据库服务器或者修改配置文件后重启服务器。需注意的是,动态设置的方式会在服务器重启后失效。
mysql> show variables like 'log_bin_trust_function_creators';
mysql> set global log_bin_trust_function_creators=1;
另外如果是在master上创建函数,想通过主从复制的方式将函数复制到slave上则也需在开启了log-bin的slave中设置上述变量的值为ON(变量的设置不会从master复制到slave上,这点需要注意),否则主从复制会报错。
2.明确指明函数的类型
DETERMINISTIC 不确定的
NO SQL 没有SQl语句,当然也不会修改数据
READS SQL DATA 只是读取数据,当然也不会修改数据
比如:CREATE DEFINER=`username`@`%` READS SQL DATA FUNCTION `fn_getitemclock`(i_itemid bigint,i_clock int,i_pos int) RETURNS int(11)...
这样一来相当于明确的告知MySQL服务器这个函数不会修改数据,因此可以在开启了log-bin的服务器上安全的创建并被复制到开启了log-bin的slave上。
若要在i ≤ R ≤ j 这个范围得到一个随机整数R ,需要用到表达式 FLOOR(i + RAND() * (j – i + 1))。
例如, 若要在7 到 12 的范围(包括7和12)内得到一个随机整数, 可使用以下语句:
SELECT FLOOR(7 + (RAND() * 6));