> 数据库 > MySQL >

mysql 方方面面

一、连接MYSQL

  格式:MySQL -h主机地址 -u用户名 -p用户密码 例如:mysql -h127.0.0.1 -uroot -proot  在windows下,需要手工加入mysql安装路径

       如果指定端口就加  -P3307   大写P

1.例1:连接到本机上的MYSQL。  首先在打开DOS窗口,然后进入目录 mysqlbin,再键入命令mysql -uroot -p,回车后提示你输密码,如果刚安装好MYSQL,超级用户root是没有密码的,故直接回车即可进入到MYSQL中了,MYSQL的提示符是:mysql>  2.例2:连接到远程主机上的MYSQL。假设远程主机的IP为:110.110.110.110,用户名为root,密码为abcd123。则键入以下命令:  mysql -h110.110.110.110 -uroot -pabcd123  (注:u与root可以不用加空格,其它也一样)  3.退出MYSQL命令:exit (回车)  注意:想要成功连接到远程主机,需要在远程主机打开MySQL远程访问权限  方法如下:  在远程主机中以管理员身份进入  输入如下命令  mysql>GRANT ALL PRIVILEGES ON *.* TO 'agui'@%'IDENTIFIEDBY '123' WITH GRANT OPTION;   FLUSH PRIVILEGES;  //赋予任何主机访问数据的权限  mysql>FLUSH PRIVILEGES   //修改生效  agui为我们使用的用户名  密码为123  即:在远程主机上作好设置,我们即可通过mysql -h110.110.110.110 -uagui -p123连接进远程主机

二、修改密码

  格式:mysqladmin -u用户名 -p旧密码 password 新密码  1.例1:给root加个密码ab12。首先在DOS下进入目录mysqlbin,然后键入以下命令  mysqladmin -uroot -password ab12  注:因为开始时root没有密码,所以-p旧密码一项就可以省略了。  2.例2:再将root的密码改为djg345。  mysqladmin -uroot -pab12 password djg345

 

 mysqladmin -uroot -h192.168.129.136 -P3307 -prhea password rheanew

 

三、增加新用户

一, 创建用户: (注意:信息都需要单引号)

       命令:CREATE USER 'username'@'host' IDENTIFIED BY 'password';

       说明:username - 你将创建的用户名, host - 指定该用户在哪个主机上可以登陆,如果是本地用户可用localhost, 如果想让该用户可以从任意远程主机登陆,可以使用通配符%. password - 该用户的登陆密码,密码可以为空,如果为空则该用户可以不需要密码登陆服务器.

      例子: CREATE USER 'dog'@'localhost' IDENTIFIED BY '123456';
               CREATE USER 'pig'@'192.168.1.101_' IDENDIFIED BY '123456';
               CREATE USER 'pig'@'%' IDENTIFIED BY '123456';
               CREATE USER 'pig'@'%' IDENTIFIED BY '';

               CREATE USER 'pig'@'%';  

 

 

权限是一个用逗号分隔的你想要赋予的MySQL用户权限的列表  。你可以指定的权限可以分为三种类型:

  数据库/数据表/数据列权限: 

Alter: 修改已存在的数据表(例如增加/删除列)和索引  。
Create: 建立新的数据库或数据表  。
Delete: 删除表的记录  。
Drop: 删除数据表或数据库  。
INDEX: 建立或删除索引  。
Insert: 增加表的记录  。
Select: 显示/搜索表的记录  。
Update: 修改表中已存在的记录  。

 

还有很多权限项目,可以先赋值全部权限给一个用户,然后revoke 一个,再show grants for user; 就可以看到到底有多少可以赋值的权限了

  全局管理MySQL用户权限:

  file: 在MySQL服务器上读写文件  。
PROCESS: 显示或杀死属于其它用户的服务线程  。
RELOAD: 重载访问控制表,刷新日志等  。
SHUTDOWN: 关闭MySQL服务  。

  特别的权限:

  ALL: 允许做任何事(和root一样)  。
USAGE: 只允许登录--其它什么也不允许做  。

 

     查看用户权限: show grants for user;

 

grant 权限 on 数据库对象 to 用户
grant select, insert, update, delete on testdb.* to common_user@'%'

 

如果需要用户拥有继续赋权的能力,最后增加: WITH GRANT OPTION;



二、查看用户

select user,host,password from mysql.user;

 

 

三.设置与更改用户密码

     命令:SET PASSWORD FOR 'username'@'host' = PASSWORD('newpassword');如果是当前登陆用户用SET PASSWORD = PASSWORD("newpassword");

      例子: SET PASSWORD FOR 'pig'@'%' = PASSWORD("123456");

 

四.撤销用户权限

      命令: REVOKE privilege ON databasename.tablename FROM 'username'@'host';

     说明: privilege, databasename, tablename - 同授权部分.

      例子: REVOKE SELECT ON *.* FROM 'pig'@'%';

 

五.删除用户

      命令: DROP USER 'username'@'host';


五、显示命令

  1.显示数据库列表。  show databases;  刚开始时才两个数据库:mysql和test。mysql库很重要它里面有MYSQL的系统信息,我们改密码和新增用户,实际上就是用这个库进行操作。  2.显示库中的数据表:  use mysql; //打开库,学过FOXBASE的一定不会陌生吧  show tables;  3.显示数据表的结构:  describe 表名;  4.建库:  create database 库名;  5.建表:  use 库名;  create table 表名 (字段设定列表);  6.删库和删表:  drop database 库名;  drop table 表名;  7、将表中记录清空:  delete from 表名;  8.显示表中的记录:  select * from 表名;  9、显示最后一个执行的语句所产生的错误、警告和通知:  show warnings;  10.只显示最后一个执行语句所产生的错误:  show errors;

六、一个建库和建表以及插入数据的实例

  drop database if exists school; //如果存在SCHOOL则删除  create database school; //建立库SCHOOL  use school; //打开库SCHOOL  create table teacher //建立表TEACHER  (  id int(3) auto_increment not null primary key,  name char(10) not null,  address varchar(50) default ‘深圳',  year date  ); //建表结束  //以下为插入字段  insert into teacher values('','glchengang',’XX公司‘,'1976-10-10');  insert into teacher values('','jack',’XX公司‘,'1975-12-23');  注:在建表中:  1.将ID设为长度为3的数字字段:int(3)并让它每个记录自动加一:auto_increment并不能为空:not null而且让他成为主字段primary key。  2.将NAME设为长度为10的字符字段。  3.将ADDRESS设为长度50的字符字段,而且缺省值为深圳。varchar和char有什么区别呢,只有等以后的文章再说了。  4.将YEAR设为日期字段。  如果你在mysql提示符键入上面的命令也可以,但不方便调试。你可以将以上命令原样写入一个文本文件中假设为school.sql,然后复制到c:\下,并在DOS状态进入目录\mysql\bin,然后键入以下命令:  mysql -uroot -p密码 < c:\school.sql  如果成功,空出一行无任何显示;如有错误,会有提示。(以上命令已经调试,你只要将//的注释去掉即可使用)。

七、将文本数据转到数据库中

  1.文本数据应符合的格式:字段数据之间用tab键隔开,null值用\n来代替.  例:  3.rose 深圳二中 1976-10-10  4.mike 深圳一中 1975-12-23  2.数据传入命令 load data local infile “文件名” into table 表名;  注意:你最好将文件复制到\mysql\bin目录下,并且要先用use命令打开表所在的数据库。

八、备份数据库

  (命令在DOS的\mysql\bin目录下执行)  mysqldump --opt school>school.bbb  注释:将数据库school备份到school.bbb文件,school.bbb是一个文本文件,文件名任取,打开看看你会有新发现。

九、启动带跟踪文件的mysqld服务器

  mysqld --debug

十、关闭MySQL服务器

  mysqladmin -uroot -proot shutdown

十一、在Windows下启动MySQL服务

  mysqld --console

 

十二、执行 SQL文件

Source c:\123.sql

回车即可执行,而且是可以批量sql语句执行

十三、查看修改表结构
desc 表名;
show columns from 表名;
describe 表名;
show create table 表名;

 

加唯一限制条件的索引549830479

mysql> alter table tablename add unique emp_name2(cardnumber);


删除某个索引549830479

   mysql>alter table tablename drop index emp_name;


修改表:549830479

增加字段:549830479

   mysql> ALTER TABLE table_name ADD field_name field_type;


修改原字段名称及类型:549830479

   mysql> ALTER TABLE table_name CHANGE old_field_name new_field_name field_type;


删除字段:549830479

   mysql> ALTER TABLE table_name DROP field_name;

PS;修改字段属性

ALTER TABLE tableName MODIFY cloumnName DATETIME;

 

十四、对应Oracle的Dual操作

mysql实际上可以没有dual,但是考虑到Oracle的习惯,也可以写dual

 

例如:

select 1+1; 与 select 1+1 from dual; 结果都是2

 

获取当前时间(日期+时间)

select current_timestamp();

获取当前日期

select current_date();

 

十五、对应Oracle的函数

 

decode 用if替代 select if(1>0,1,2);

trim(s) - 移除开头跟字尾的空格符。也可以用 rtrim() 或 ltrim()

replace(target, find, replace) - 传回 target 字符串,将 find 字符串覆盖成 replace 字符串

length(s) - 找字符串的长度

substring(s, position, length) - 传回字符串里的字符串,s 是本来的字符串,position 是开始的位置,length 是传回的字数

select ifnull( a, b ) 替代 nvl(a, b)

大小写:select lower(s) ; select upper(s);

to_char( date, 'yyyymmdd)对应的:date_format(a.ctime,'%Y-%c-%d %h:%i:%s')

 

十六、JDBC驱动

到mysql的主页,http://www.mysql.com/    download里面有一个connecters,里面下载

我已经存放到D:\nokill\W我的笔记\W文档\Java\网上收集\mysql

 

十七、MySql相关工具

 

 sqlyog 夏亮推荐,远程管理维护工具

 

 

十八、MySql 自动提交autocommit 问题( MySQL事务的理解)

mysql默认是自动提提的,这个很郁闷,可以通过执行语句来设置不自动提交

set autocommit=0;

 

也可以修改mysql.ini

最后增加:

[mysqld]
init_connect='SET AUTOCOMMIT=0'

 

但是这个只对普通用户有效,root登录进去后无效 , 仍然是autocommit=TRUE

可以通过 show variables like 'autocommit';来查看

【天啦】这个Autocommit绝对不能设置为false,这个是大忌讳

设置为false后,其他事务链接修改数据库,哪怕commit了,当前事务也无法看到,除非空执行一次commit或者rollback;,也就是说这个autocommit完全不是事务的概念,他会让你看不到别人提交的东西

 

进一步分析,得出MySQL的事务经验的初步结论:

1. MySQL支持事务,前提是表使用的是InnoDB引擎,这个似乎最新版本是默认值,确认办法是标记my.ini,看看#skip-innodb 是不是前面有一个#来注释,这句话必须带#注释掉

 

2. MySQL支持事务不彻底,不稳定,见我转载的 MySQL与Oracle的区别,目前感觉MySQL不能用于信息系统,只能是简单的信息存储检索

 

3. MySQL使用Java操作或者直接用工具输入SQL,默认是没有事务的,即执行就提交,那么需要Begin来开启事务,这样才支持回滚

            st = conn.createStatement();
            st.execute("begin");
            pst = conn.prepareStatement("insert into rhea_kvm(name, os, ip) values (?,?,?)");
            pst.setString(1, "my xp");
            pst.setString(2, "windows");
            pst.setString(3, "192.1.12.1");
            pst.execute();
            conn.commit();

但是注意,MySQL的事务有些怪异,一个链接Begin后,在Commit或者Rollback前,无法检索到其他事务的提交数据,但是可以删除到,神奇!!!

例如:

A事务,Begin  然后Select * from rhea_kvm 得到0

B事务  Begin; Insert; Commit;

A事务再去检索,还是0,但是去Delete from rhea_kvm;可以删除到一行

A如果Commit或者Rollback;后去检索,就能看到结果

 

 




(责任编辑:IT)