`
happyzhen
  • 浏览: 49871 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

mysql5.0使用总结

阅读更多

mysql5.0使用总结

创建表,以及表之间的关系
use test;
create table person(
id smallint unsigned not null auto_increment,
name char(40) not null,
primary key(id));
create table shirt(
id smallint unsigned not null auto_increment,
style enum('t-shirt','polo','dress') not null,
color enum('red','blue','orange') not null,
owner smallint unsigned not null references person(id),
primary key(id));
创建视图
create view skirt_view as
select person.id as id,person.name as name,shirt.style as style,shirt.color as color from person,shirt
where person.id=shirt.owner;
创建用户
grant all privileges on *.* to 'money2'@'%' identified by 'panjun2' with grant option;
grant all privileges on *.* to 'money2'@'localhost' identified by 'panjun2' with grant option;

创建存储过程以及函数
格式:       
CREATE PROCEDURE 过程名 ([过程参数[,...]])
    [特性 ...] 过程体

CREATE FUNCTION 函数名 ([函数参数[,...]])
    RETURNS 返回类型
    [特性 ...] 函数体
   
过程参数:
    [ IN | OUT | INOUT ] 参数名 参数类型
函数参数:
    参数名 参数类型

返回类型:
    有效的MySQL数据类型即可

过程体/函数体:格式如下:
BEGIN
    有效的SQL语句
END   
在开发过程中有几点要注意:
1、存储过程注释:MySQL支持采用--或者/**/注释,其中前者是行注释,后者是段式注释
2、变量首先用declare申明,其中临时变量可以直接以@前缀修饰以供引用
3、直接采用MySQL的Administrator管理器编辑时,可以直接采用如下函数文本录入;
   但若在脚本中自动导入存储过程或函数时,由于MySQL默认以";"为分隔符,则过程体的每一句
   都被MySQL以存储过程编译,则编译过程会报错;所以要事先用DELIMITER关键字申明当前段分隔符
   用完了就把分隔符还原。  如下所示:
       DELIMITER $$
       Stored Procedures and Functions
       DELIMITER ;
mysql> delimiter //
mysql> CREATE PROCEDURE mysp ()
    -> BEGIN
    ->   IF @@server_id=2 THEN DROP DATABASE accounting; END IF;
    -> END;
    -> //
mysql> delimiter ;
mysql> CALL mysp();
下面是2个例子,提供了一种字串加密的算法,每次以相同的入参调用都会得到不同的加密结果,
   算法相对比较简单,不具备强度。分别以函数和过程的形式分别实现如下:
(1)函数

eg:
CREATE FUNCTION fun_addmm(inpass varchar(10)) RETURNS varchar(11)
BEGIN
     declare string_in varchar(39);
     declare string_out varchar(78);
     declare offset tinyint(2);
     declare outpass varchar(30) default ';
     declare len tinyint;
     /*declare i tinyint;*/

     /**/
     set len=LENGTH(inpass);
     if((len<=0) or (len>10)) then
         return "";
     end if;

     set offset=(SECOND(NOW()) mod 39)+1; /*根据秒数取模*/
     /*insert into  testtb values(offset,'offset: ');*/
     set string_out='YN8K1JOZVURB3MDETS5GPL27AXWIHQ94C6F0#$_';  /*密钥*/
     set string_in='_$#ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';

     set outpass=CONCAT(outpass,SUBSTRING(string_out,offset,1));
/*     insert into  testtb values(2,outpass);*/
     set string_out=CONCAT(string_out,string_out);
     set @i=0;
     REPEAT
       set @i=@i+1;
       set outpass=CONCAT(outpass,SUBSTR(string_out,INSTR(string_in,SUBSTRING(inpass,@i,1))+offset,1));
/*       insert into  testtb values(@i+2,outpass);*/
     UNTIL (@i>=len)
     end REPEAT;

     return outpass;
END


(2)过程

CREATE PROCEDURE `pro_addmm`(IN inpass varchar(10),OUT outpass varchar(11))
BEGIN
     declare string_in varchar(39);
     declare string_out varchar(78);
     declare offset tinyint(2);               
     declare len tinyint;

     set outpass=';

     set len=LENGTH(inpass);
     if((len<=0) or (len>10)) then
         set outpass=';
     else
         set offset=(SECOND(NOW()) mod 39)+1;

         set string_out='YN8K1JOZVURB3MDETS5GPL27AXWIHQ94C6F0#$_';
         set string_in='_$#ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';

         set outpass=CONCAT(outpass,SUBSTRING(string_out,offset,1));

         set string_out=CONCAT(string_out,string_out);
         set @i=0;
         REPEAT
               set @i=@i+1;
               set outpass=CONCAT(outpass,SUBSTR(string_out,INSTR(string_in,SUBSTRING(inpass,@i,1))+offset,1));
         UNTIL (@i>=len)
         end REPEAT;
     end if;
END


//
执行结果如下:
mysql> call pro_addmm('zhouys',@a);
Query OK, 0 rows affected (0.00 sec)
mysql> SELECT @a;
+---------+
| @a      |
+---------+
| U_PI6$4 |
+---------+
1 row in set (0.00 sec)
mysql> call pro_addmm('zhouys',@a);
Query OK, 0 rows affected (0.00 sec)
mysql> SELECT @a;
+---------+
| @a      |
+---------+
| 9P8UEGM |
+---------+
1 row in set (0.00 sec)
mysql> select fun_submm('U_PI6$4');
+----------------------+
| fun_submm('U_PI6$4') |
+----------------------+
| ZHOUYS               |
+----------------------+
1 row in set (0.00 sec)
加密算法有几个弱点:
1、不支持大小写
2、不支持中文
3、加密强度不够

如果用mysql query browser分析器来做,就不用delimiter了:

CREATE PROCEDURE `procedure1`(myid int,name varchar(20), password varchar(20))
BEGIN
  INSERT INTO user(id,name,password)
  VALUES (myid, name,password);
END

总结函数存储过程:
# Basic syntax to create a function
delimiter //
create function add_tax (price float) returns float
return price*1.1;
//
delimiter ;
调用直接用:select add_tax(100);
程序清单存储过程:
#basic
# Basic stored procedure example
delimiter //
create procedure total_orders (out total float)
begin
select sum(amount) into total from orders;
end
//
delimiter ;
调用代码为:call total_orders(@b);
mysql->select @b;

mysql默认的是本地主机是localhost,对应的IP地址就是127.0.0.1,所以你用你的IP地址登录会出错,如果你想用你的IP地址登录就要先进行授权用grant命令。  
  mysql>grant   all   on   *.*   to   root@202.116.39.2   identified   by   "123456";  
   
  说明:grant   与on   之间是各种权限,例如:insert,select,update等  
  on   之后是数据库名和表名,第一个*表示所有的数据库,第二个*表示所有的表  
  root可以改成你的用户名,@后可以跟域名或IP地址,identified   by   后面的是登录用的密码,可以省略,即缺省密码或者叫空密码。
 
Server   Host:localhost       Port:3306  
  Username:root  
  Password:*******  
  Default   Schema:test 

 

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics