通过xyykt项目,总结了mysql的一些常用命令及遇到的问题.
登陆:mysql -u用户名 -p密码
用户
为用户赋权限语句:GRANT SELECT, INSERT, UPDATE, DELETE, EXECUTE, CREATE ROUTINE, ALTER ROUTINE ON `AUTHTEST`.* TO 'username@'%'
注意:username@'%'和username@'localhost'是两个不同的用户,付给一个用户的权限不会适用于另一个。
配置文件my.cnf
mysql配置文件路径:/etc/my.cnf (如果这里没有,还可以尝试查找:mysql-data-dir/my.cnf, ~/.my.cnf)
mysql安装完后,需要修改这个配置文件,添加两行:
default-character-set=gbk(或utf8):使数据库支持中文,使后面新建的模式默认字符为gbk(详细见前面的博文“MYSQL数据库字符集支持”、“mysql字符集问题”);
lower_case_table_names=1:使mysql不区分大小写(如果在数据库区分大小写的情况下,新建了名称为大写的模式、表等。后来在my.cnf添加了这一行,这些对象就不能再使用。因为不区分大小写就意味着mysql将所有命令及sql语句的大写字母自动转换成小写,再到数据库中匹配,若数据库中有大写名称的对象,就无法被识别);
表类型
(参见“mysql表类型”)如果表涉及到事务操作,需要在建表时制定表类型为InnoDB, 语句是:
create table databasename.tablename
(
……
)engine=InnoDB;
timestamp类型注意
(参见“mysql TIMESTAMP详解 ”)一个表里只能有一个自动生成类型的字段:自动生成字段类型包括自增流水、insert自动更新timestamp、update自动更新timestamp。
如果一个表里需要存在多个这种字段,可以用触发器trigger,例如:
create table databasename.tablename
(
……
intime timestamp not null default CURRENT_TIMESTAMP,
modtime timestamp,
……
);
create trigger databasename.triggername before update on databasename.tablename for each row set new.modtime=now();
存储过程执行权限
原理:用户A创建一个存储过程,将其执行权限赋给用户B,则用户B可以执行该存储过程。
mysql-connector-java-5.1.12-bin.jar的bug:以上原理不适用,也就是说,用户A创建的存储过程,给用户B付了执行权限以后,B仍然无法执行。解决办法是在mysql连接的参数中添加“noAccessToProcedureBodies=true”;
mysql-connector-java-5.1.13-bin.jar修正了这个bug。