注:-- 双中划线 + 空格:注释(单行注释),也可以使用#号
-- 库操作
(一)创建数据库
例:mysql> create database mystudent charset uft8;
#SQL语句报错:只会告诉用户报错的大概位置不会说明原因(静默模式)
例:mysql> create database `databases` charset utf8;
#数据库名称不能使用关键字如果非要使用需前后加上符号 ' (esc 键下面的键再英文状态下输出)
1.创建中文数据库
例:mysql> set names gbk;
例:mysql> create database 中文 charset utf8;
#MySQL也能使用中文数据库.但需告诉服务器当前中文的字符集(不建议使用)
#创建数据库成功会再daya目录下创建与数据库对应名字的文件夹
(二)查看数据库
1.查看所有数据库
mysql> show databases;
2.查看指定部分的数据库
mysql> show database like [数据库名];
# %:表示匹配多个字符 # _:表示匹配单个字符
3.查看数据库的创建语句
mysql> show create database [数据库名]; #如果涉及关键字或中文需加反引号
(三) 更新数据库
#数据库的名字不可以修改,数据库的修改仅限库选项:字符集和校队集
mysql> alter database [数据库名] charset utf8;
(四) 删除数据库
mysql> drop database [数据库名];
#删除操作后会将数据库名字对应的文件夹一并删除(级联删除:里面的数据表全部删除)删除数据库是不可逆的,删除需谨慎
-- 表操作
(一)创建表
例:mysql>use [数据库名]
mysql> create table [if not exists] [表名] charset utf8;
或:
mysql> create table if not exists student(name varchar(10),gender varchar(10),number varchar(10),age int ) charset utf8;
# if not exists:如果表名不存在,那么创建,否则不执行代码
表选项:字符集:chart 具体字符集;保证表中数据存储的字符集
校对集:collate 具体校对集;
存储引擎:engine 具体的存储引擎(innodb 和myisam)
(二)查看表
1.查看所有表
例:mysql> show tables;
2.查看部分表:模糊匹配:mysql> show tables like 'pattern';
# %:表示匹配多个字符 # _:表示匹配单个字符
3.查看表创建语句
例:mysql> show create table student;
例:mysql> show create table student g #g 等同于;
例:mysql> show create table student G #将查到的结构旋转90度
4.查看表结构:查看表中的字段信息
mysql> desc [表名]; mysql> describe [表名]; show columns from [表名];
5.修改数据表
表本身存在,还包含字段:表的修改分为两个部分;修改表本身和修改字段,表本身可以修改;表名和表选项
5-1.修改表名:
mysql> rename table [老表名] to [新表名];
5-2.修改表选项:字符集
mysql> alter table [表名] charset = utf8;
6.修改字段
字段操作很多;新增,修改,重名,删除
6-1.新增字段
例:mysql> alter table [表名]add [字段名] [数据类型列属性] [位置];
# 位置:字段名可以存放表中的任意位置
# first :第一个位置,after :在哪个字段之后:alter 字段名;默认的是在最后一个字段之后
例:mysql> alter table my_student add colum id int first;
#注:可分为多行,mysql会自动寻找分号:只认分号为语句结束符。
6-2 修改字段
alter table [表名] modify [字段名] [数据类型] [属性] [位置];
例:mysql> alter table my_student modify number char(10) after id;
6-3 重命名字段
alter table [表名] change [旧字段] [新字段名] 数据类型 [属性] [位置]
例:修改学生表中的gender 字段为 sex
mysql> alter table my_student change gender sex varchar(10);
7. 删除字段
alter table [表名] drop [字段名];
例:mysql> alter table my_student drop age;
#如果表中存在数据,删除表会删除字段中的全部数据,且删除不可逆需备份好在做删除
8.删除数据表
drop table [表名 1] ,[表名2] ..; #可以一次性删除多张表,数据库不能多个删除
例:mysql> drop table class; #删除数据表也会删除数据库对应的文件夹下的文件(与存储引擎有关),且删除不可逆需谨慎
-- 数据操作
1.1 新增数据
方案1.给权标字段插入数据,不需要指定字段列表;要求数据的值出现的顺序必须与表中设计的字段出现的顺序一致;凡是非数值数据,都需要使用引号(建议单引号)包裹
insert into [表名] values[(值列表1),(值列表2)]; #可以一次性插入多条记录
例:mysql> insert into my_student values(1,'itcast0001','jim','male'), (2,'itcast0002','hanmeimei','famale');
方案2.给部分字段插入数据,需选定字段列表;字段列表出现的顺序与字段的顺序无关,但值列表的顺序必须与选定的字段的顺序一致。
insert into [表名] [字段列表] values[(值列表1),(列表2)];
例:mysql> insert into my_student (number,sex,name,id) values('itcast0003','male','tom',3),('itcast0004','female','lily',4);
1.2 查看数据
select */字段列表 from 表名 where [条件]; #星号代表所有也可选定字段列表,也可不跟条件
例1:mysql> select * from my_student; #查看所有数据
例子2:mysql> select id,number,sex,name from my_student where id = 1; #查看my_student id为1的数据
1.3 更新数据
update [表名] set [字段] = [值] where [条件]; #where 可有可无,但建议都有where 要不就更新全部
mysql> update my_student set sex = 'female' where name = 'jim';
# 如果没有真正的数据更新不会成功。
1.4 删除数据
delete from [表名] where [条件]; #建议加条件以防止全部删除
mysql> delete from my_student where sex = 'male'; #删除需谨慎
-- 中文数据问题
中文数据问题本质是字符集问题,计算机只识别二进制,而人类更多只识别符号,需要有个二进制与字符的对应关系(字符集)
案例:mysql> insert into my_student values(5,'itcast0005','张越','男'); #插入中文数据
如上客户端向服务器插入中文数据不成功
原因:xD5xC5xD4xBD 代表的是中文'张越' 在当前编码(字符集)下对应的二进制编码转换成的十六进制:两个汉字等于四个字节(JBK)。报错的原因是服务器没有识别对应的四个字节,服务器认为数据是utf8(一个汉字有三个字节),读取三个字节转换成汉字(失败),剩余的再读三个字节(不够),最终导致失败.
所有的数据库服务器认为的一些特性都是通过服务器端的变量来保存;系统先读取自己的变量,看看应该怎样表现。
查看服务器识别哪些字符集
mysql> show character set; #查看所有字符集
mysql> show variables like 'character_set%'; #查看服务器默认的对外处理的字符集
问题解析:客户端数据智能是GBK ,而服务器认为是UTF8,告诉服务器默认的接收字符集为JBK。
mysql> set character_set_client = gbk; #修改服务器认为的客户端的字符集为GBK
插入中文效果:
但查看数据,依然乱码,原因:数据来源是服务器而解析数据是客户端(客户端只识别GBK,而客户端给的是utf8 所以乱码)
解决方案:修改服务器给客户端的数据字符集为GBK
mysql> set character_set_results = gbk;
查看数据效果
set 变量 = 值 ;修改只是会话级别(当前客户端,当次连接有效,关闭失效)退出登陆效果如下
设置服务器对客户端的字符集的认识:可以使用快捷方式:set names [字符集]
mysql> set names gbk; #等价于三步骤(character_set_client,character_set_results,character_set_connection;)
connection 连接层:是字符集转变的中间者,如果统一了效率更高,不统一也没问题。
-- 校队集问题
校队集:数据比较的方式
校队集有三种格式:
_bin:binary,二进制比较,取出二进制位,一位一位的比较,区分大小写
_cs:case sensitive,大小写敏感,区分大小写
_ci:case insensitice,大小写不敏感,不区分大小写
mysql> show collation; #查看数据库所支持的校队集,校对集的应用:只有当数据产生比较的时候校对集才会生效,对比:使用utf8 的_bin 和_ci 来验证效果。
创建表使用不同的校队集
mysql> create table my_collate_bin(name char(1)) charset utf8 collate utf8_bin;
mysql> create table my_collate_ci(name char(1)) charset utf8 collate utf8_general_ci;
1.创建不同校队集的
2.插入数据
mysql> insert into my_collate_bin values('a'),('A'),('B'),('B');
mysql> insert into my_collate_ci values('a'),('A'),('B'),('B');
3.比较:根据某个字段进行排序:order by 字段名 [asc|desc];asc 升序,desc 降序,默认升序
mysql> select * from my_collate_bin order by name; #排序查找
mysql> select * from my_collate_ci order by name; #排序查找
校队集必须再没有数据之前声明好,如果有了数据再进行的话那么修改无效。
mysql> alter table my_collate_ci collate = utf8_bin;
-- 乱码问题
web 乱码问题
动态网站有三部分构成:浏览器,apache 服务器(php) 数据库服务器,三个部分都有自己的字符集(中文);数据需要再三个部分之间来回传递:很容易产生乱码
解决方案:统一编码(三码合一),但实际上不可能因为浏览器是用户管理(根本不可能控制),但又必须解决此类问题主要靠PHP