[mysql] 实现事件调度器(Event Scheduler)以及计划任务

MySQL5.1.x版本中引入了一项新特性EVENT,顾名思义就是事件、定时任务机制,在指定的时间单元内执行特定的任务,因此今后一些对数据定时性操作不再依赖外部程序,而直接使用数据库本身提供的功能。

要查看当前是否已开启事件调度器,可执行如下SQL:

SHOW VARIABLES LIKE 'event_scheduler';
或

SELECT @@event_scheduler;
或

SHOW PROCESSLIST;

显示:

+—————–+——-+
| Variable_name   | Value |
+—————–+——-+
| event_scheduler | OFF   |
+—————–+——-+

则可执行

SET GLOBAL event_scheduler = 1;
或

SET GLOBAL event_scheduler = ON;

来开启,也可以直接在启动命令加上“–event_scheduler=1”,例如:

mysqld ... --event_scheduler=1

my.ini or my.cnf 中的

[mysqld]
添加 event_scheduler=ON

 创建事件(CREATE EVENT)

先来看一下它的语法:

CREATE EVENT [IF NOT EXISTS] event_name
ON SCHEDULE schedule
[ON COMPLETION [NOT] PRESERVE]
[ENABLE | DISABLE]
[COMMENT 'comment']
DO sql_statement;

schedule:
AT TIMESTAMP [+ INTERVAL INTERVAL]
| EVERY INTERVAL [STARTS TIMESTAMP] [ENDS TIMESTAMP]

INTERVAL:
quantity {YEAR | QUARTER | MONTH | DAY | HOUR | MINUTE |
            WEEK | SECOND | YEAR_MONTH | DAY_HOUR | DAY_MINUTE |
            DAY_SECOND | HOUR_MINUTE | HOUR_SECOND | MINUTE_SECOND}

1)首先来看一个简单的例子来演示每秒插入一条记录到数据表

USE test;
CREATE TABLE aaa (timeline TIMESTAMP);
CREATE EVENT e_test_insert
ON SCHEDULE EVERY 1 SECOND 
DO INSERT INTO test.aaa VALUES (CURRENT_TIMESTAMP);

等待3秒钟后,再执行查询成功。

2) 5天后清空test表:

CREATE EVENT e_test
ON SCHEDULE AT CURRENT_TIMESTAMP + INTERVAL 5 DAY
DO TRUNCATE TABLE test.aaa;

3) 2007年7月20日12点整清空test表:

CREATE EVENT e_test
ON SCHEDULE AT TIMESTAMP '2007-07-20 12:00:00'
DO TRUNCATE TABLE test.aaa;

4) 每天定时清空test表:

CREATE EVENT e_test
ON SCHEDULE EVERY 1 DAY
DO TRUNCATE TABLE test.aaa;

5) 5天后开启每天定时清空test表:

CREATE EVENT e_test
ON SCHEDULE EVERY 1 DAY
STARTS CURRENT_TIMESTAMP + INTERVAL 5 DAY
DO TRUNCATE TABLE test.aaa;

6) 每天定时清空test表,5天后停止执行:

CREATE EVENT e_test
ON SCHEDULE EVERY 1 DAY
ENDS CURRENT_TIMESTAMP + INTERVAL 5 DAY
DO TRUNCATE TABLE test.aaa;

7) 5天后开启每天定时清空test表,一个月后停止执行:

CREATE EVENT e_test
ON SCHEDULE EVERY 1 DAY
STARTS CURRENT_TIMESTAMP + INTERVAL 5 DAY
ENDS CURRENT_TIMESTAMP + INTERVAL 1 MONTH
DO TRUNCATE TABLE test.aaa;

[ON COMPLETION [NOT] PRESERVE]可以设置这个事件是执行一次还是持久执行,默认为NOT PRESERVE。

8) 每天定时清空test表(只执行一次,任务完成后就终止该事件):

CREATE EVENT e_test
ON SCHEDULE EVERY 1 DAY
ON COMPLETION NOT PRESERVE
DO TRUNCATE TABLE test.aaa;

[ENABLE | DISABLE]可是设置该事件创建后状态是否开启或关闭,默认为ENABLE。
[COMMENT ‘comment’]可以给该事件加上注释。

修改事件(ALTER EVENT)

ALTER EVENT event_name
[ON SCHEDULE schedule]
[RENAME TO new_event_name]
[ON COMPLETION [NOT] PRESERVE]
[COMMENT 'comment']
[ENABLE | DISABLE]
[DO sql_statement]

1) 临时关闭事件

ALTER EVENT e_test DISABLE;

2) 开启事件

ALTER EVENT e_test ENABLE;

3) 将每天清空test表改为5天清空一次:

ALTER EVENT e_test
ON SCHEDULE EVERY 5 DAY;

 删除事件(DROP EVENT)

语法很简单,如下所示:

DROP EVENT [IF EXISTS] event_name

例如删除前面创建的e_test事件

DROP EVENT e_test;

当然前提是这个事件存在,否则会产生ERROR 1513 (HY000): Unknown event错误,因此最好加上IF EXISTS

DROP EVENT IF EXISTS e_test;

[mysql] 实现存储过程

1. CREATE  PROCEDURE  (创建)

CREATE PROCEDURE存储过程名 (参数列表)
   BEGIN
         SQL语句代码块
END

 注意:

由括号包围的参数列必须总是存在。如果没有参数,也该使用一个空参数列()。每个参数默认都是一个IN参数。要指定为其它参数,可在参数名之前使用关键词 OUT或INOUT
mysql客户端定义存储过程的时候使用delimiter命令来把语句定界符从;变为//。
当使用delimiter命令时,你应该避免使用反斜杠(‘"’)字符,因为那是MySQL的转义字符。
如:
mysql> delimiter //
mysql> CREATE PROCEDURE simpleproc (OUT param1 INT)
    -> BEGIN
    ->   SELECT COUNT(*) INTO param1 FROM t;
    -> END
    -> //
Query OK, 0 rows affected (0.00 sec)

2.  ALTER  PROCEDURE (修改)

ALTER PROCEDURE 存储过程名SQL语句代码块
这个语句可以被用来改变一个存储程序的特征。

3.  DROP  PROCEDURE (删除)

DROP PROCEDURE  IF  EXISTS存储过程名

eg:DROP PROCEDURE IF EXISTS proc_employee (proc_employee 存储过程名)
这个语句被用来移除一个存储程序。不能在一个存储过程中删除另一个存储过程,只能调用另一个存储过程

4.  SHOW  CREATE  PROCEDURE(类似于SHOW CREATE TABLE,查看一个已存在的存储过程)

SHOW CREATE PROCEDURE 存储过程名

5.  SHOW  PROCEDURE  STATUS (列出所有的存储过程)

SHOW  PROCEDURE  STATUS

6.  CALL语句(存储过程的调用)

CALL 存储过程名(参数列表)
CALL语句调用一个先前用CREATE PROCEDURE创建的程序。
CALL语句可以用声明为OUT或的INOUT参数的参数给它的调用者传回值。
存储过程名称后面必须加括号,哪怕该存储过程没有参数传递

7.  BEGIN … END(复合语句)

[begin_label:] 
BEGIN
    [statement_list]
END 
[end_label]

存储子程序可以使用BEGIN … END复合语句来包含多个语句。

statement_list 代表一个或多个语句的列表。statement_list之内每个语句都必须用分号(;)来结尾。

复合语句可以被标记。除非begin_label存在,否则end_label不能被给出,并且如果二者都存在,他们必须是同样的。

8.  DECLARE语句(用来声明局部变量)

DECLARE语句被用来把不同项目局域到一个子程序:局部变量

DECLARE仅被用在BEGIN … END复合语句里,并且必须在复合语句的开头,在任何其它语句之前。

9.  存储程序中的变量

9.1           DECLARE局部变量
DECLARE var_name[,...] type [DEFAULT value]
这个语句被用来声明局部变量。
要给变量提供一个默认值,请包含一个DEFAULT子句。
值可以被指定为一个表达式,不需要为一个常数。
如果没有DEFAULT子句,初始值为NULL。
局部变量的作用范围在它被声明的BEGIN ... END块内。

它可以被用在嵌套的块中,除了那些用相同名字声明变量的块。
9.2             变量SET语句
SET var_name = expr [, var_name = expr]
在存储程序中的SET语句是一般SET语句的扩展版本。
被参考变量可能是子程序内声明的变量,或者是全局服务器变量。
在存储程序中的SET语句作为预先存在的SET语法的一部分来实现。这允许SET a=x, b=y, ...这样的扩展语法。
其中不同的变量类型(局域声明变量及全局和集体变量)可以被混合起来。

这也允许把局部变量和一些只对系统变量有意义的选项合并起来。
9.3    SELECT … INTO语句
SELECT col_name[,...] INTO var_name[,...] table_expr
这个SELECT语法把选定的列直接存储到变量。
因此,只有单一的行可以被取回。
SELECT id,data INTO x,y FROM test.t1 LIMIT 1;
注意,用户变量名在MySQL 5.1中是对大小写不敏感的。

重要: 
SQL变量名不能和列名一样。如果SELECT ... INTO这样的SQL语句包含一个对列的参考,并包含一个与列相同名字的局部变量,MySQL当前把参考解释为一个变量的名字。

10.   MySQL 存储过程参数类型(in、out、inout)

MySQL 存储过程参数(in)

MySQL 存储过程 “in” 参数:跟 C 语言的函数参数的值传递类似, MySQL 存储过程内部可能会修改此参数,但对 in 类型参数的修改,对调用者(caller)来说是不可见的(not visible)。

MySQL 存储过程参数(out

MySQL 存储过程 “out” 参数:从存储过程内部传值给调用者。在存储过程内部,该参数初始值为 null,无论调用者是否给存储过程参数设置值

MySQL 存储过程参数(inout

MySQL 存储过程 inout 参数跟 out 类似,都可以从存储过程内部传值给调用者。不同的是:调用者还可以通过 inout 参数传递值给存储过程。

总结

如果仅仅想把数据传给 MySQL 存储过程,那就使用“in” 类型参数;如果仅仅从 MySQL 存储过程返回值,那就使用“out” 类型参数;如果需要把数据传给 MySQL 存储过程,还要经过一些计算后再传回给我们,此时,要使用“inout” 类型参数。

11.  例子:

创建存储过程

带(输出参数)返回值的存储过程:

--删除存储过程

DROP PROCEDURE IF EXISTS proc_employee_getCount

--创建存储过程

CREATE PROCEDURE proc_employee_getCount(out n int)

BEGIN

     SELECT COUNT(*) FROM employee ;

END

--MYSQL调用存储过程

CALL proc_employee_getCount(@n);

带输入参数的存储过程:

--删除存储过程

DROP PROCEDURE IF EXISTS proc_employee_findById;

--创建存储过程

CREATE PROCEDURE proc_employee_findById(in n int)

BEGIN

     SELECT * FROM employee where id=n;

END

--定义变量

SET @n=1;

--调用存储过程

CALL proc_employee_findById(@n);

操作存储过程时应注意:

1.          删除存储过程时只需要指定存储过程名即可,不带括号;

2.          创建存储过程时,不管该存储过程有无参数,都需要带括号;

3.          在使用SET定义变量时应遵循SET的语法规则;

 SET @变量名=初始值;

4.          在定义存储过程参数列表时,应注意参数名与数据库中字段名区别开来,否则将出现无法预期的结果

说明: 来源于跟我学MySQL存储过程

[php] 汉字转换为拼音方法

在项目中需要将中文转换为拼音的功能,在网上一查找到如下方法,经自己测试,能实现此功能!

/**
 * 中文转拼音
 * @param type $_String
 * @param type $_Code
 * @return type
 */
function Pinyin($_String, $_Code = 'UTF8') {
    //GBK页面可改为gb2312,其他随意填写为UTF8
    $_DataKey = "a|ai|an|ang|ao|ba|bai|ban|bang|bao|bei|ben|beng|bi|bian|biao|bie|bin|bing|bo|bu|ca|cai|can|cang|cao|ce|ceng|cha" .
            "|chai|chan|chang|chao|che|chen|cheng|chi|chong|chou|chu|chuai|chuan|chuang|chui|chun|chuo|ci|cong|cou|cu|" .
            "cuan|cui|cun|cuo|da|dai|dan|dang|dao|de|deng|di|dian|diao|die|ding|diu|dong|dou|du|duan|dui|dun|duo|e|en|er" .
            "|fa|fan|fang|fei|fen|feng|fo|fou|fu|ga|gai|gan|gang|gao|ge|gei|gen|geng|gong|gou|gu|gua|guai|guan|guang|gui" .
            "|gun|guo|ha|hai|han|hang|hao|he|hei|hen|heng|hong|hou|hu|hua|huai|huan|huang|hui|hun|huo|ji|jia|jian|jiang" .
            "|jiao|jie|jin|jing|jiong|jiu|ju|juan|jue|jun|ka|kai|kan|kang|kao|ke|ken|keng|kong|kou|ku|kua|kuai|kuan|kuang" .
            "|kui|kun|kuo|la|lai|lan|lang|lao|le|lei|leng|li|lia|lian|liang|liao|lie|lin|ling|liu|long|lou|lu|lv|luan|lue" .
            "|lun|luo|ma|mai|man|mang|mao|me|mei|men|meng|mi|mian|miao|mie|min|ming|miu|mo|mou|mu|na|nai|nan|nang|nao|ne" .
            "|nei|nen|neng|ni|nian|niang|niao|nie|nin|ning|niu|nong|nu|nv|nuan|nue|nuo|o|ou|pa|pai|pan|pang|pao|pei|pen" .
            "|peng|pi|pian|piao|pie|pin|ping|po|pu|qi|qia|qian|qiang|qiao|qie|qin|qing|qiong|qiu|qu|quan|que|qun|ran|rang" .
            "|rao|re|ren|reng|ri|rong|rou|ru|ruan|rui|run|ruo|sa|sai|san|sang|sao|se|sen|seng|sha|shai|shan|shang|shao|" .
            "she|shen|sheng|shi|shou|shu|shua|shuai|shuan|shuang|shui|shun|shuo|si|song|sou|su|suan|sui|sun|suo|ta|tai|" .
            "tan|tang|tao|te|teng|ti|tian|tiao|tie|ting|tong|tou|tu|tuan|tui|tun|tuo|wa|wai|wan|wang|wei|wen|weng|wo|wu" .
            "|xi|xia|xian|xiang|xiao|xie|xin|xing|xiong|xiu|xu|xuan|xue|xun|ya|yan|yang|yao|ye|yi|yin|ying|yo|yong|you" .
            "|yu|yuan|yue|yun|za|zai|zan|zang|zao|ze|zei|zen|zeng|zha|zhai|zhan|zhang|zhao|zhe|zhen|zheng|zhi|zhong|" .
            "zhou|zhu|zhua|zhuai|zhuan|zhuang|zhui|zhun|zhuo|zi|zong|zou|zu|zuan|zui|zun|zuo";
    $_DataValue = "-20319|-20317|-20304|-20295|-20292|-20283|-20265|-20257|-20242|-20230|-20051|-20036|-20032|-20026|-20002|-19990" .
            "|-19986|-19982|-19976|-19805|-19784|-19775|-19774|-19763|-19756|-19751|-19746|-19741|-19739|-19728|-19725" .
            "|-19715|-19540|-19531|-19525|-19515|-19500|-19484|-19479|-19467|-19289|-19288|-19281|-19275|-19270|-19263" .
            "|-19261|-19249|-19243|-19242|-19238|-19235|-19227|-19224|-19218|-19212|-19038|-19023|-19018|-19006|-19003" .
            "|-18996|-18977|-18961|-18952|-18783|-18774|-18773|-18763|-18756|-18741|-18735|-18731|-18722|-18710|-18697" .
            "|-18696|-18526|-18518|-18501|-18490|-18478|-18463|-18448|-18447|-18446|-18239|-18237|-18231|-18220|-18211" .
            "|-18201|-18184|-18183|-18181|-18012|-17997|-17988|-17970|-17964|-17961|-17950|-17947|-17931|-17928|-17922" .
            "|-17759|-17752|-17733|-17730|-17721|-17703|-17701|-17697|-17692|-17683|-17676|-17496|-17487|-17482|-17468" .
            "|-17454|-17433|-17427|-17417|-17202|-17185|-16983|-16970|-16942|-16915|-16733|-16708|-16706|-16689|-16664" .
            "|-16657|-16647|-16474|-16470|-16465|-16459|-16452|-16448|-16433|-16429|-16427|-16423|-16419|-16412|-16407" .
            "|-16403|-16401|-16393|-16220|-16216|-16212|-16205|-16202|-16187|-16180|-16171|-16169|-16158|-16155|-15959" .
            "|-15958|-15944|-15933|-15920|-15915|-15903|-15889|-15878|-15707|-15701|-15681|-15667|-15661|-15659|-15652" .
            "|-15640|-15631|-15625|-15454|-15448|-15436|-15435|-15419|-15416|-15408|-15394|-15385|-15377|-15375|-15369" .
            "|-15363|-15362|-15183|-15180|-15165|-15158|-15153|-15150|-15149|-15144|-15143|-15141|-15140|-15139|-15128" .
            "|-15121|-15119|-15117|-15110|-15109|-14941|-14937|-14933|-14930|-14929|-14928|-14926|-14922|-14921|-14914" .
            "|-14908|-14902|-14894|-14889|-14882|-14873|-14871|-14857|-14678|-14674|-14670|-14668|-14663|-14654|-14645" .
            "|-14630|-14594|-14429|-14407|-14399|-14384|-14379|-14368|-14355|-14353|-14345|-14170|-14159|-14151|-14149" .
            "|-14145|-14140|-14137|-14135|-14125|-14123|-14122|-14112|-14109|-14099|-14097|-14094|-14092|-14090|-14087" .
            "|-14083|-13917|-13914|-13910|-13907|-13906|-13905|-13896|-13894|-13878|-13870|-13859|-13847|-13831|-13658" .
            "|-13611|-13601|-13406|-13404|-13400|-13398|-13395|-13391|-13387|-13383|-13367|-13359|-13356|-13343|-13340" .
            "|-13329|-13326|-13318|-13147|-13138|-13120|-13107|-13096|-13095|-13091|-13076|-13068|-13063|-13060|-12888" .
            "|-12875|-12871|-12860|-12858|-12852|-12849|-12838|-12831|-12829|-12812|-12802|-12607|-12597|-12594|-12585" .
            "|-12556|-12359|-12346|-12320|-12300|-12120|-12099|-12089|-12074|-12067|-12058|-12039|-11867|-11861|-11847" .
            "|-11831|-11798|-11781|-11604|-11589|-11536|-11358|-11340|-11339|-11324|-11303|-11097|-11077|-11067|-11055" .
            "|-11052|-11045|-11041|-11038|-11024|-11020|-11019|-11018|-11014|-10838|-10832|-10815|-10800|-10790|-10780" .
            "|-10764|-10587|-10544|-10533|-10519|-10331|-10329|-10328|-10322|-10315|-10309|-10307|-10296|-10281|-10274" .
            "|-10270|-10262|-10260|-10256|-10254";
    $_TDataKey = explode('|', $_DataKey);
    $_TDataValue = explode('|', $_DataValue);
    $_Data = array_combine($_TDataKey, $_TDataValue);
    arsort($_Data);
    reset($_Data);
    if ($_Code != 'gb2312')
        $_String = _U2_Utf8_Gb($_String);
    $_Res = '';
    for ($i = 0; $i < strlen($_String); $i++) {
        $_P = ord(substr($_String, $i, 1));
        if ($_P > 160) {
            $_Q = ord(substr($_String, ++$i, 1));
            $_P = $_P * 256 + $_Q - 65536;
        }
        $_Res .= _Pinyin($_P, $_Data);
    }
    return preg_replace("/[^a-z0-9]*/", '', $_Res);
}

function _Pinyin($_Num, $_Data) {
    if ($_Num > 0 && $_Num < 160) {
        return chr($_Num);
    } elseif ($_Num < -20319 || $_Num > -10247) {
        return '';
    } else {
        foreach ($_Data as $k => $v) {
            if ($v <= $_Num)
                break;
        }
        return $k;
    }
}

function _U2_Utf8_Gb($_C) {
    $_String = '';
    if ($_C < 0x80) {
        $_String .= $_C;
    } elseif ($_C < 0x800) {
        $_String .= chr(0xC0 | $_C >> 6);
        $_String .= chr(0x80 | $_C & 0x3F);
    } elseif ($_C < 0x10000) {
        $_String .= chr(0xE0 | $_C >> 12);
        $_String .= chr(0x80 | $_C >> 6 & 0x3F);
        $_String .= chr(0x80 | $_C & 0x3F);
    } elseif ($_C < 0x200000) {
        $_String .= chr(0xF0 | $_C >> 18);
        $_String .= chr(0x80 | $_C >> 12 & 0x3F);
        $_String .= chr(0x80 | $_C >> 6 & 0x3F);
        $_String .= chr(0x80 | $_C & 0x3F);
    }
    return iconv('UTF-8', 'GB2312', $_String);
}

[技术排行榜] 2014年5月编程语言排行榜:Adobe ActionScript进入top20

本月份ActionScript进入TIOBE指数的前20名。ActionScript是一种主要用于写FLASH的程序,用来显示交互动画和录像的JavaScript的方言。在2008年和2009年, ActionScript在Flash中受欢迎程度已经达到顶峰。但在史蒂夫·乔布斯宣布禁止其苹果所有的设备使用Flash,让ActionScript迅速失宠。不过Flash(和ActionScript)仍在努力进入移动市场,主要基于Web的小游戏,因此也获得了市场份额,Flash和ActionScript仍然是市场领导者,安装率达到了96%。

排行榜前20名:

wKioL1Nq86PCMhNNAAIIp5Md3Cs418

 

前10名趋势走向:

wKiom1Nq9PPQczlUAAN8r70KN7U654

 

编程语言排行后50名:

wKiom1Nq9MLgP27mAAGXH47OJ7Q401

 

后50名的编程语言排行:

4th Dimension/4D, Algol, Alice, APL, ATLAS, Automator, Awk, Bash, bc, BlitzMax, Bourne shell, C shell, CL (OS/400), Clean, Clojure, Common Lisp, Emacs Lisp, Factor, Felix, Forth, Icon, Inform, J, JScript.NET, Korn shell, LabVIEW, Ladder Logic, M4, Magic, Max/MSP, Moto, NATURAL, NXT-G, OCaml, OpenCL, Oz, PILOT, Programming Without Coding Technology, Pure Data, Q, Revolution, S, Smalltalk, SPARK, Standard ML, TOM, Vala/Genie, VBScript, VHDL, X10

说明:

来源于51cto.

[php]配置以及实现mail()函数

之前总是喜欢用phpmailer插件来实现邮件发送,而从来没有真正的在某个项目中采用php自带的mail()函数来实现发送邮件的功能。今天刚好有项目需要,所以通过php自带的mail()函数来实现项目中需要的发送邮件功能!

说明: 在windows环境(windows service 2008)下,需要安装sendmail

第一步: 下载sendmail

下载地址: sendmail

第二步:  解压安装包(最好和php同一个目录下C:\websoft\)

20140504164208

20140504164538

 

第三步: 配置php.ini文件

[mail function]
; For Win32 only.
SMTP = smtp.jhonse.com
smtp_port = 25
; For Win32 only.
sendmail_from = service@jhonse.com
; For Unix only. You may supply arguments as well (default: “sendmail -t -i”).
sendmail_path = "C:\websoft\sendmail\sendmail.exe -t"

 第四步:配置sendmail.ini文件

error_logfile=error.log

; create debug log as debug.log (defaults to same directory as sendmail.exe)
; uncomment to enable debugging

debug_logfile=debug.log

; if your smtp server requires authentication, modify the following two lines

auth_username=service@jhonse.com
auth_password=123456

; if your smtp server uses pop3 before smtp authentication, modify the 
; following three lines.  do not enable unless it is required.

pop3_server=
pop3_username=
pop3_password=

; force the sender to always be the following email address
; this will only affect the "MAIL FROM" command, it won't modify 
; the "From: " header of the message content

force_sender=service@jhonse.com

; force the sender to always be the following email address
; this will only affect the "RCTP TO" command, it won't modify 
; the "To: " header of the message content

说明:  第一次最好启用debug.log_file,error_logfile,以查看sendmail是否生效。

第五步: 重启apache或者IIS

重启之后,mail()函数就可以正常发送邮件了。

//send email
mail($to, $subject, $message, $headers);

20140504165452