Mysql存储引擎数据类型和字符集
Posted zhichun
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Mysql存储引擎数据类型和字符集相关的知识,希望对你有一定的参考价值。
表类型(存储引擎)的选择
mysql支持的存储引擎包括MyISAM、InnoDB、BDB、MERGE、EXAMPLE、NDB、Cluster、ARCHIVE、CSV、BLACKHOLE、FEDERATED等其中InnoDB和BDB提供事物安全表,其他存储引擎都是非事务安全表。
查看当前的默认存储引擎
show variables like 'table_type';
SHOW ENGINES;
在创建表的时候可以通过增加ENGINE关键字设置新建表的存储引擎
CREATE TABLE ai(
i bigint(20) NOT NULL AUTO_INCREMENT,
PRIMARY KEY(i)
)ENGINE=MyISAM DEFAULT CHARSET=gbk;
CREATE TABLE country(
country_id samllint unsigned not null auto_increment,
country varchar(30) not null,
last_update TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
)engine=InnoDB DEFAULT CHARSET=gbk;
更改存储引擎
ALTER TABLE ai engine = INNODB
show create table ai
运行结果如下,显示引擎变为InnoDB
CREATE TABLE `ai` (
`ID` int(11) NOT NULL AUTO_INCREMENT,
`bin` bit(1) DEFAULT NULL,
PRIMARY KEY (`ID`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8
选择合适的存储引擎
InnoDB
InnoDB存储引擎提供了具有提交、回滚、崩溃恢复能力的事务安全处理。
1 自动增长列
CREATE table autoincre_demo
(i smallint not null auto_increment,
name varchar(10), PRIMARY key(i)
)engine=innodb;
insert into autoincre_demo values(1,'1'),(0,'2'),(null,'3')
select * from autoincre_demo;
语句强制设置自动增长列的初始值,默认从1开始。
可以使用LAST_INSERT_ID()查询当前线程最后插入记录使用的值,如果一次插入了多条记录,那么返回的是第一条记录使用的自动增长列。
select LAST_INSERT_ID();
INSERT into autoincre_demo(name) VALUES('5'),('6'),('7')
对于InnoDB表,自动增长列必须是索引。如果是组合索引,也必须是组合索引的第一列。
2.外键约束
CREATE TABLE `country` (
`country_id` smallint(5) unsigned NOT NULL AUTO_INCREMENT,
`country` varchar(50) NOT NULL,
`last_update` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`country_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
create table city(
city_id smallint unsigned not null auto_increment,
city varchar(50) not null,
country_id smallint unsigned not null,
last_update timestamp not null default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP,
PRIMARY key(city_id),
key idx_fx_country_id(country_id),
constraint 'fk_city_country' foreign key(country_id) references country(country_id) on DELETE restrict on update CASCADE
)engine=INNODB default charset=utf8;
3.存储方式
数据类型
CHAR和VARCHAR
CREATE TABLE vc1(v VARCHAR(4), c CHAR(4));
insert into vc1 VALUES('ab ','ab ');
select concat(v,'+'),concat(c,'+') from vc1;
由于CHAR是固定长度,处理速度比VARCHAR快的多,但是缺点是浪费储存空间
TEXT和BLOB
二者主要差别是BLOB能用来保存二进制数据,比如照片;而TEXT只能保存字符数据。
对表进行优化操作
insert into table1 VALUES(1,repeat('haha',20));
insert into table1 VALUES(2,repeat('haha',20));
insert into table1 VALUES(3,repeat('haha',10));
insert into table1 select * from table1;
insert into table1 select * from table1;
optimize table table1;
使用合成索引来提高文本字段的查询措施
create table table2(id varchar(100),context blob,hash_value varchar(40));
insert into table2 values(1,repeat('beijing',2),md5(context));
insert into table2 values(2,repeat('beijing1',2),md5(context));
insert into table2 values(3,repeat('beijing2',2),md5(context));
select * from table2;
如果要查询“beijing2 beijing2”的记录,可以通过散列值来查询。
select * from table2 where hash_value=md5(repeat('beijng1',2))
浮点数和定点数
浮点数一般用来表示含有小数部分的数值,当一个字段被定义为浮点数之后,如果插入数据的精度超过该列的实际精度,则插入值会被四舍五入到实际定义的精度值。
CREATE table table3(f float(8,1));
insert into table3 VALUES(1.23456);
SELECT * from table3;
CREATE table test(c1 float(10,2), c2 decimal(10,2));
insert into test values(131072.32,131072.32);
select * from test;
日期类型选择
字符集
show character set;
查询当前服务器的字符集和校对规则:
show variables like 'character_set_server';
使用新的字符集创建新的数据库:
create database databasename default charset gbk;
以上是关于Mysql存储引擎数据类型和字符集的主要内容,如果未能解决你的问题,请参考以下文章