深入浅出MySQL++数据库开发、优化与管理维护+第2版+唐汉明 -- 存储引擎 - 数据类型 - 字符集和校验规则 -

时间:2023-12-27 23:59:19

create schema deepInMySql;
use deepInMySql;

-- 查看当前默认存储引擎
show variables like '%table_type%';

-- 查看当前数据库支持的存储引擎
show engines;
show variables like '%have%';

-- myisam

-- 创建表 ai
create table ai(
i bigint(20) not null auto_increment,
primary key (i)
)engine = MyISAM default charset = gbk;

create table country(
country_id smallint 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 = gbk;

-- 查看表ddl
show create table ai;

-- 修改表的存储引擎
alter table ai engine = innodb;

create table myisam_char(
name char(10)
) engine = MyISAM default charset = gbk;

-- 插入记录
insert into myisam_char values('abcde'), ('abcde '), (' abcde'), (' abcde ');

-- 查询记录
select name, length(name) from myisam_char;

-- innodb

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;

-- 查询当前线程最后插入记录使用的值
select last_insert_id();

insert into autoincre_demo values(4, '4');
insert into autoincre_demo values(5, '5'), (6, '6'), (7, '7');

create table autoincre_demo_myisam(
d1 smallint not null auto_increment,
d2 smallint not null,
name varchar(10),
index(d2,d1)
) engine = MyISAM;

insert into autoincre_demo_myisam(d2, name) values(2, '2'), (3, '3'), (4, '4'),(2, '2'), (3, '3'), (4, '4');

select * from autoincre_demo_myisam;

-- char 和 varchar
create table vc(
v varchar(4),
c char(4)
);

show create table vc;

insert into vc values('ab ', 'ab ');

select concat(v, '+'), concat(c, '+') from vc;

-- text 和 blob
create table t(
id varchar(100),
context text
);

insert into t values(1, repeat('haha', 100));
insert into t values(2, repeat('haha', 100));
insert into t values(3, repeat('haha', 100));

select * from t;

insert into t select * from t;
insert into t select * from t;

select * from t;

optimize table t;

delete from t where id = 1;

optimize table t;

-- 浮点数 和 定点数

create table t2(
f float(8,1)
);

desc t2;

insert t2 value(1.23456);

select * from t2;

insert t2 value(1.25456);

select * from t2;

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;

desc information_schema.CHARACTER_SETS;

-- 校对规则
show collation like '%gbk%';

select case when 'A' collate gbk_chinese_ci = 'a' collate gbk_chinese_ci then 1 else 0 end;

select case when 'A' collate gbk_bin = 'a' collate gbk_bin then 1 else 0 end;

select case when 'A' collate utf8_general_ci = 'a' collate utf8_general_ci then 1 else 0 end;

-- 字符集设置 -- 服务器级别 -- 数据库级别 -- 表级别 -- 字段级别

-- 服务器字符集和校对规则
show variables like 'character_set_server';

show variables like 'collation_server';

-- 数据库字符集和校对规则
show variables like 'character_set_database';

show variables like 'collation_database';

-- 表字符集和校对规则
show create table test;

-- 列字符集和校对规则

-- 连接字符集和校验规则

-- 字符集的修改
-- alter database character set ***
-- alter table tablename character set ***
-- 这两个命令都没有更新已有记录的字符集,而只是对新创建的表或记录生效

-- 已有记录的字符集调整,需要先将数据导出,经过适当的调整重新导入后才可完成。
-- 模拟将latin1字符集的数据库修改成GBK字符集的数据库的过程
-- 1. 导出表结构
-- mysqldump -uroot -p --default-character-set=gbk -d databasename > createtab.sql
-- 其中--default-character-set=gbk表示设置以什么字符集连接,-d表示只导出表结构,不导出数据。
-- 2. 手动修改createtab.sql 中表结构定义中的字符集为新的字符集。
-- 3. 确保记录不再更新,导出所有记录
-- mysqldump -uroot -p --quick --no-create-info --extended-insert --default-character-set=latin1 databasename > data.sql
-- --quick 该选项用于转储大的表。它强制mysqldump从服务器一次一行地检索表中的行而不是检索所有行,并在输出前将它缓存到内存中。
-- --extended-insert 使用包括几个VALUES列表的多行INSERT语法。这样是转储文件更小,重载文件时可以加速插入。
-- --no-create-info 不导出每个转储表的CREATE TABLE语句。
-- --default-character-set=latin1 按照原有的字符集导出数据,这样导出的文件中,所有中文都是可见的,不会保存成乱码。
-- 4. 打开data.sql, 将SET NAMES latin1 修改成 SET NAMES gbk。
-- 5. 使用新的字符集创建新的数据库。
-- create dateabase databasename default charset gbk;
-- create database deepInMySql2 default charset gbk;
-- 6. 创建表,执行createtab.sql
-- mysql -uroot -p databasename < createtab.sql
-- mysql -uroot -p deepInMySql2 < createtab.sql
-- 7. 导入数据,执行data.sql
-- mysql -uroot -p databasename < data.sql
-- mysql -uroot -p deepInMySql2 < data.sql

-- 第9章