一、启动与退出


1、进入MySQL:
启动MySQL Command Line Client(MySQL的DOS界面),直接输入安装时的密码即可。此时的提示符是:mysql>
或打开终端,输入SQL语句:
mysql –uroot –p
2、退出MySQL:
quit或exit

二、库操作


1、创建数据库
命令:create database <数据库名>
例如:建立一个名为ceshi的数据库
mysql> create database ceshi;
2、显示所有的数据库
命令:show databases (注意:最后有个s)
mysql> show databases;
3、删除数据库
命令:drop database <数据库名>
例如:删除名为 ceshi的数据库
mysql> drop database ceshi;
4、连接数据库
命令: use <数据库名>
例如:如果ceshi数据库存在,尝试存取它:
mysql> use ceshi;
屏幕提示:Database changed
5、当前选择(连接)的数据库
mysql> select database();
6、当前数据库包含的表信息:
mysql> show tables; (注意:最后有个s)
7、创建用户并赋予取予权利:
grant all privileges on dbname.* to username@localhost identified by ‘root′;
给localhost域的用户username管理dbname数据库的所有权利,密码为root。

三、表操作


1、建表
命令:create table <表名> ( <字段名1> <类型1> [,..<字段名n> <类型n>]);
mysql> create table MyClass(
> id int(4) not null primary key auto_increment,
> name char(20) not null,
> sex int(4) not null default '0',
> degree double(16,2));
2、获取表结构
命令: desc 表名,或者show columns from 表名
mysql> desc MyClass;
mysql> show columns from MyClass;
3、删除表
命令:drop table <表名>
例如:删除表名为 MyClass 的表
mysql> drop table MyClass;
4、插入数据
命令:insert into <表名> ( 字段名,字段名 ) values ( 值1 ,值2), ( 值1,值2)
5、查询表中的数据
1)、查询所有行
命令: select 字段1,字段2 from  表名  where 条件
例如:查看表 ceshi中所有数据
mysql> select * from ceshi;
2)、查询前几行数据
例如:查看表 ceshi中前2行数据
mysql> select * from ceshiorder by id limit 0,2;
6、删除表中数据
命令:delete from 表名 where 表达式
例如:删除表 ceshi中编号为1 的记录
mysql> delete from ceshi where id=1;
7、修改表中数据:
update 表名 set 字段=新值,… where 条件
mysql> update ceshiset name='小米' where id=1;
8、在表中增加字段:
命令:alter table 表名 add字段 类型 其他;
例如:在表ceshi中添加了一个字段passtest,类型为int(4),默认值为0
mysql> alter table ceshiadd passtest int(4) default '0'
9、更改表名:
命令:rename table 原表名 to 新表名;
例如:在表ceshi名字更改为ceshi1
mysql> rename table ceshi to ceshi1;
更新字段内容
update 表名 set 字段名 = 新内容
update 表名 set 字段名 = replace(字段名,'旧内容','新内容');
文章前面加入4个空格
update article set content=concat(' ',content);

四、字段类型介绍



int型包括(tinyint, smallint, mediumint, int, bigint)

tinyint是1个字节表达范围就是2的8次方(-128-128) 或者(0-255) 很多人不明白为什么有两种情况,因为在计算机中有一种说法叫做无符号,也就是全部是正整数,所以在用MySQL 选择整形字段的时候一定要加上unsigned也就是无符号,因为负数基本不会用到。

smallint是2个字节表达范围2的16次方

smallint是3个字节表达范围2的24次方

int是4个字节表达范围2的32次方,记住这个类型是不能存储手机号的,很多人用它存然后直接报错了,因为int最长到10长度,手机号是11位,所以如果存手机号我的建议就是下面的char类型

bigint是8个字节表达方位就是2的64次方。

char型

表达范围0-255字节数,如果是存字母就是255个,因为每个字母只占一个字节,无论是什么编码,如果是存gbk存中文就是2个字节代表一个汉字,所以就是255/2,如果是utf8编码就是255/3,因为utf8编码下的中文占用三个字节代表一个汉字。正确的说应该叫做Unicode编码 又叫做万国码,他的实现有utf8

varchar型

表达范围是0-65535字节,我有一个长辈同事,年龄较大,他到现在还认为varchar最大是0-255,这是错误的,如果是在MySQL5.0.3 之前的版本是对的,后面的版本都已经改成了65535字节理论上存储汉字utf8就是2000多个。

text型

表达范围就是65535字节,一般用来存商品描述,等字符数比较多的等,它也有4种TEXT类型:TINYTEXT、TEXT、MEDIUMTEXT和LONGTEXT,存储容量不同,含有字符集。

blob型

以二进制形式存储数据,是的可以存储图片。度出去依然是图片。

decimal型

DECIMAL列的声明语法是DECIMAL(M,D), M是数字的最大数(精度)。其范围为1~65(在较旧的MySQL版本中,允许的范围是1~254), D是小数点右侧数字的数目(标度)。其范围是0~30,但不得超过M,一般用来存储money 也就是钱比如:decimal(10,2),他是以字符串形式存储数字的,不会引起存储的数据不正常,缺斤短两,存储精度需求高的最好选择这个字段,那些选择bigint类型存钱的 真不知道是怎么想的。应该是不知道有这个字段类型吧

float型

浮点型,也就是存小数,效果一般。

enum型

枚举类型,就是建字段的时候输入几个默认的字符,存储也只能存储这几个字符中的一个。例如:enum(“Y”,‘’N”);

set型

一个集合。可以有0到64个值,均来自于指定内容和enum类似,但是enum只能存储一个值,但是set可以存储多个值,如果用多个值用逗号隔开存储。

date型

存储日期格式:'YYYY-MM-DD',范围:'1000-01-01'到'9999-12-31'。

time型

存储时间格式:'HH:MM:SS';

datetime

其实就是date和time合起来,存储日期和时间格式:'YYYY-MM-DD HH:MM:SS',范围:'1000-01-01 00:00:00'到'9999-12-31 23:59:59'。

timestamp型(时间戳)

格式:'YYYYMMDDHHMMSS'、'YYMMDDHHMMSS'、'YYYYMMDD'、'YYMMDD',范围:'1970-01-01 00:00:00'到'2037-01-01 00:00:00'。

一般存储时间还是用int型,存储时间戳

year型

存储年份的,格式”YYYY“;

五、数据库备份


1.导出整个数据库
mysqldump -u 用户名 -p --default-character-set=latin1 数据库名 > 导出的文件名(数据库默认编码是latin1)
mysqldump -u wcnc -p smgp_apps_wcnc > ceshi.sql
2.导出一个表
mysqldump -u 用户名 -p 数据库名 表名> 导出的文件名
mysqldump -u wcnc -p smgp_apps_wcnc ceshi> ceshi.sql
3.导出一个数据库结构
mysqldump -u wcnc -p -d –add-drop-table smgp_apps_wcnc >d:wcnc_db.sql
-d 没有数据 –add-drop-table 在每个create语句之前增加一个drop table
4.导入数据库
常用source 命令
进入mysql数据库控制台,
如mysql -u root -p
mysql>use 数据库
然后使用source命令,后面参数为脚本文件(如这里用到的.sql)
mysql>source d:ceshi.sql




六、关于mysql配置和报错问题


使用utf8编码

在MySQL的配置文件中做如下设置:
[client]
default-character-set = utf8

[mysqld]
character-set-server = utf8
然后重启MySQL服务,需要注意的是,已经创建的表不受影响。
启用查询日志

[mysqld]
...
general-log=1
general-log-file = /var/log/mysql/general.log
...
禁用Innodb引擎

MySQL5.5之后使用Innodb作为默认引擎,如果嫌其太耗内存,可以使用如下配置禁用Innodb并使用MyISAM作为默认引擎。
在my.cnf的mysqld区块内添加如下两行:
[mysqld]
...
innodb=OFF
default_storage_engine=MyISAM
...
然后重启mysql服务并登陆到mysql后使用如下命令查看引擎状况:
mysql> SHOW VARIABLES LIKE '%storage_engine%';
经验

CHAR和VARCHAR的长度

从MySQL 5.X之后,CHAR(20)和VARCHAR(20)里的数字20都是指字符个数,不管是什么编码。另外由于MySQL限制每行数据最大不超过65535字节,因此这些字段的最大长度和字段个数都要有所限制。1
忘记root密码

首先,修改mysql的配置文件/etc/mysql/my.cnf,在[mysqld]区域添加skip-grant-tables,之后重启mysql服务service mysql restart。
然后不用密码登陆mysql的root用户mysql -uroot,依次执行如下命令:
mysql> use mysql;               # 切换到mysql数据库
mysql> update user set password=password('NEW_PASSWORD') where user = 'root'; # NEW_PASSWORD是你的新密码
mysql> flush privileges;        # 刷新系统权限
最后,修改配置文件/etc/mysql/my.cnf,将[mysqld]里刚刚添加的skip-grant-tables删除,重启mysql服务。
思考

日期用什么类型存储

在MySQL数据库中,日期可以使用多种类型进行存储,以下是我目前想到的各种类型的优缺点。
MySQL Date and Time Types: MySQL内置的日期和时间类型,好处是MySQL有很多内置的日期和时间函数可供使用,缺点是可移植性很差。
char或varchar: 暂时没想到什么优点。
int: 优点是可移植性好,可以做一些基本的比较操作,缺点是和MySQL的内置日期时间类型比,可用函数很少;另外,int类型无法存储时区信息。
问题

Error 1175 Safe Updtes Mode

错误提示如下:
ERROR 1175: You are using safe update mode and you tried to update a table without a WHERE that uses a KEY column.
错误的原因是启用了MySQL的Safe Updtes Mode,它的作用是如果执行Update和Delete操作的时候,没有带键限制的where语句或limit语句,sql操作不会执行。详细的介绍可参考MySQL Tips: safe-updates。
可使用SET sql_safe_updates=0;来暂时禁用Safe Updates Mode。
Stopping MySQL database server: mysqld failed

环境
OS: debian6 squeeze
Mysql: 5.1.63
使用service mysql restart命令时显示Stopping MySQL database server: mysqld failed!,导致无法重启mysql服务。
解决方法
问题是由mysql数据库的user表中debian-sys-maint用户的密码和/etc/mysql/debian.cnf中的密码不一致所引发的,参考这篇文章,即可解决。具体步骤如下。
查看/etc/mysql/debian.cnf中的password,cat /etc/mysql/debian.cnf,有两个password,不过值是相同的。
连接到mysql,mysql -uroot -p
为debian-sys-maint用户修改密码。
GRANT ALL PRIVILEGES ON . TO 'debian-sys-maint'@'localhost' IDENTIFIED BYWITH GRANT OPTION;
问题原因
之前使用backup脚本迁移网站时,只迁移了/etc/mysql/debian.cnf,没有迁移mysql里的mysql数据库,导致mysql数据库中user表里的debian-sys-maint的密码和/etc/mysql/debian.cnf不一致。
Snippets

以数据库db和表tb为例。
管理相关

显示所有的数据库
mysql> show databases;
显示当前数据库的所有表
mysql> show tables;
切换数据库
mysql> use db
显示表的结构
mysql> desc tb;
显示数据库的创建信息
mysql> show create database db;
显示表的创建语句
mysql> show create table tb;
备份某张表
$ mysqldump -u $user -p $db $table > table.sql
表管理

修改表的字符集
mysql> ALTER TABLE 'db'.'tb' CHARACTER SET utf8;
修改字段的字符集,参考Column Character Set Conversion。
查看数据库mydb中各个表的大小(包括索引),并按大小逆序排列
mysql> SELECT table_name AS "Tables",
round(((data_length + index_length) / 1024 / 1024), 2) AS "Size in MB"
FROM information_schema.TABLES
WHERE table_schema = "mydb"
ORDER BY (data_length + index_length) DESC;
权限相关

详细内容见MySQL Account Management SQL。
显示权限
mysql> SHOW GRANTS FOR 'user_name'@'host';
分配权限
mysql> GRANT ALL PRIVILEGES ON 'database'.'table' TO 'user_name'@'host' IDENTIFIED BY 'password';
mysql> FLUSH PRIVILEGES;
解除权限
mysql> REVOKE ALL PRIVILEGES ON 'database'.'table' FROM 'user_name'@'host';
mysql> FLUSH PRIVILEGES;
批量删除表

批量删除有相同前缀的表,使用下面的sql语句会构造相应的drop语句,删除wordpress3数据库中前缀为wp_的表。
SELECT CONCAT( 'DROP TABLE IF EXISTS wordpress3.', TABLE_NAME, ';' )
FROM information_schema.tables
WHERE TABLE_SCHEMA = 'wordpress3' AND TABLE_NAME LIKE 'wp_%';
删除步骤如下,首先生成删除命令并保存到drop.sql文件中。
mysql -uroot -ANspe "SELECT CONCAT( 'DROP TABLE IF EXISTS wordpress3.', TABLE_NAME, ';' )
FROM information_schema.tables
WHERE TABLE_SCHEMA = 'wordpress3' AND TABLE_NAME LIKE 'wp_%';" > drop.sql
然后检查drop.sql文件中的语句是否正确,如果无误,最后执行如下命令即可。(执行删除命令前务必提前备份相关的数据)
mysql -uroot -p -e "source drop.sql"