mysql数据库(第1版)
小编:郑保珍
为什么要使用数据库:海量存储高速查询
1.登录与服务:
登录: mysql -uroot -proot (登录本机mysql服务器)
mysql -uroot -proot -h 192.168.10.1 (登录ip为192.168.10.1的mysql服务器)
退出: exit \\q quit Ctrl+c
服务:
net stop mysql 停止mysql服务 net start mysql 启动mysql服务 net restart mysql 重启mysql服务
C:> 注意最后没有封号。
2:mysql编码:
set names gbk|utf8 :临时编码设置,当再次进入mysql中的时候将再次转变为默认编码: status; \\s :查看编码
show variables like 'charac%' :查看编码
Server characterset: utf8 服务器编码
Db characterset: utf8 当前数据库编码 Client characterset: utf8 客户编码
Conn. characterset: utf8 客户连接编码
character_set_client | utf8 客户编码 character_set_connection | utf8 连接编码
character_set_database | utf8 当前数据库编码 character_set_results | utf8 结果集 character_set_server | utf8 服务器 character_set_system | utf8 系统
3.database操作:
1 查看和切换:
显示当前所有数据为名称:show databases; show schemas(); 查看当前使用的数据库:select database(); 切换或进入当前数据库:use db_name;
2 创建:create database|schema [if not exists] db_name [default] character set [=] '字符集';
查看:show create database db_name; 删除:drop database db_name
4.data类型 数值
tinyint 1个字节 有符号:-128 到127 ,无符号:0-255
smallint 2个字节 3.27w正负 mediumint 3个字节 3000w int 4个字节 21亿正负
int 和 int(5) 都是4个字节 21亿正负,基本无区别。
bigint 8个字节
总结,int(M) zerofill,加上zerofill后M才表现出有点点效果,比如 int(3) zerofill,你插入到数据库里的是10,则实际插入为010,也就是在前面补充加了一个0.如果int(3)和int(10)不加 zerofill,则它们没有什 么区别.M不是用来限制int个数的.int(M)的最大值和最小值与undesigned有关,如下图:
mysql> create table t (t int(3) zerofill); mysql> insert into t set t = 10; mysql> select * from t; +——+ | t | +——+ | 010 | +——+
mysql> create table t (t int zerofill); mysql> insert into t set t = 10; mysql> select * from t; +————+ | t |
+————+ | 0000000010 | +————+
mysql> create table t (t int); mysql> insert into t set t = 10; mysql> select * from t; +——+ | t | +——+ | 10 | +——+
其实当我们在选择使用int的类型的时候,不论是int(3)还是int(11),它在数据库里面存储的都是4个 字节的长度,在使用int(3)的时候如果你输入的是10,会默认给你存储位010,也就是说这个3代表的 是默认的一个长度,当你不足3位时,会帮你补全,当你超过3位时,就没有任何的影响。他们之间 除了在存储的时候稍微有点区别外,在我们使用的时候是没有任何区别的。int(10)也可以代表 2147483647这个 值int(11)也可以代表。要查看出不同效果记得在创建类型的时候加 zerofill这个值, 表示用0填充,否则看不出效果的。我 们通常在创建数据库的时候都不会加入这个选项,所以可以 说他们之间是没有区别的。
float(M,D) 4或8个字节
M:代表小数的总位数,D代表小数点后的位数Float(6,2) -9999.99到+9999.99 M最大位数10的38次方,D的位数也是10的38次方。 如果M<=24的时候,占4个字节,负责占8个字节。
decimal ‘高精度’浮点数
定点,是把整形部分和小数部分分开存储的,所以精确度比fload精确。
而且fload有时候会出现细微误差。但是如果银行的工资表等也不会用decimal, 它会用int型,或者bigint,把单位定了为分来取消小数存储。
123456789.987456321 把整数部分和小数部分拆开,每9个位占4个字节,所以一共占 8字节
double 8个字节
文本
char(M)
[固定长度字符段串]
优点:在查找行记录的时候,如果都是定长,完全可以通过行数和行的长度来计算出来 文件指针的偏移量,加快查询效率
缺点:对于定长N,不论够不够指定长度,实际都占据N个长度,如果不够N个长度, 用空格在尾部补至N个长度
M范围:0到255 之间
varchar(M) [可变长度字符段串]
如果用varchar(M)中,字节数为达到M,不用空格补齐,但列内容前有1-2个字节来标 记该列的内容。
M范围:0到65535之间。utf8 22000左右
注意:char(M),varchar(M)限制的是字符,不是字节。
比如:char(2) charset utf8 能存2个utf8字符,比如“中国”或者’aa’;
text 文本不用加默认值,加了也没用。2万到3万汉子,新闻,论坛中可以使用。
文本类型,可以存比较大的文本段,搜索速度稍慢,因此,如果不是特别大的内容,建议使 用char或varchar来代替
blob 可以原样存储数据。
日期
date 3字节 年月日 1000-01-01 ~ 9999-12-31 time 3字节 时分秒 00:00:00 ~ 23:59:59
datetime 8字节 年月日时分秒 1000-01-01 00:00:00 ~ 9999-12-31 23:59:59 timstamp 4字节 年月日时分秒1000-01-01 00:00:00 ~ 9999-12-31 23:59:59 year 1字节 YYYY 1901~2155
ts timestamp default CURRENT_TIMESTAMP 性别
char(1) 女 男 enum('男','女');
2》日期函数:
得到当前日期:curdate(),current_date(),current_date;
得到当前时间:curtime(),current_timie(),current_time;
得到系统日期:now (),sysdate();
3》字符串函数
length(str):字符串长度 password(str):加密字符串
concat(str1,str2...):连接字符串,如果连接的字符串中如果出现NULL,返回结构为NULL 列名称 id userName sex weight birth salary lastlogin intro 列类型 Int unsigned varchar(20) char(1) /tinyint tinyint unsigned date datetime datetime varchar(1500) 默认值 是否主键 PRE
这张表不够好,可以优化:
分析:这张表除了userName和intro之外,每一类都是定长,如果我们让所有列都是定长的话,可以极大 提高查询效率。
1. userName 由varchar(20) 变成了char(20)后 ,虽然造成了空间的小量浪费,但是提高了速度。