MySQL中的编码和数据类型1.字符集
1. 字符集在什么时候可以发挥作⽤?
1. 保存数据的时候需要使⽤字符集
2. 数据传输的时候也需要使⽤字符集
3. 在存续的时候使⽤字符集
1. 在MySQL的服务器上, 在数据库中, 在表的使⽤上, 在字段的设置上.
2. 在服务器安装的时候, 可以指定默认的字符集
2. 常见字符集
ASCII: 基于罗马字母表的⼀套字符集, 它采⽤1个字节的低7位表⽰字符, ⾼位始终为0。
LATIN1: 相对于ASCII字符集做了扩展, 仍然使⽤⼀个字节表⽰字符, 但启⽤了⾼位, 扩展了字
符集的表⽰范围。
GB2312: 简体中⽂字符, ⼀个汉字最多占⽤2个字节
GBK: 只是所有的中⽂字符, ⼀个汉字最多占⽤2个字节
UTF8: 国际通⽤编码, ⼀个汉字最多占⽤3个字节
UTF8MB4: 国际通⽤编码, 在utf8的基础上加强了对新⽂字识别, ⼀个汉字最多占⽤4个字节/* gbk字符集最⼤字符串长度: 65535/2 -1 */
create table test(
text varchar(32766)
) charset=gbk;
/* utf8字符集最⼤字符串长度: 65535/3 -1 */
create table test1(
text varchar(21844)
) charset=utf8;
/* utf8mb4字符集最⼤字符串长度: 65535/4 -1 */
create table test4(
text varchar(16382)
) charset=utf8mb4;
3. 查看当前mysql系统⽀持的字符集
mysql> show variables like 'character_%';
/* 输出:
+--------------------------+------------+
| Variable_name | Value |
+--------------------------+------------+
| character_set_client | utf8mb4 | 客户端来源数据使⽤的字符集
| character_set_connection | utf8mb4 | 连接层字符集
| character_set_database | utf8mb4 | 当前选中的数据库的默认字符集
| character_set_filesystem | binary | ⽂件系统字符集
| character_set_results | utf8mb4 | 查询结果使⽤的字符集
| character_set_server | utf8mb4 | 默认的内部操作字符集
| character_set_system | utf8 | 系统元数据(字段名、表名等)的字符集
| character_sets_dir | / |
+--------------------------+------------+
*/
4. 修改当前的 mysql 系统的字符集编码
全部修改
set names gbk;
指定修改
set character_set_client = gbk;
set character_set_results = gbk;
它是临时性命令, mysql链接断开以后, 再次连接时会恢复原状。
2.校对集
在某⼀种字符集下, 为了使字符之间可以互相⽐较, 让字符和字符形成⼀种关系的集合, 称之为校对集。
⽐如说 ASCII 中的 a 和 B, 如果区分⼤⼩写 a > B, 如果不区分 a < B;不同字符集有不同的校对规则, 命名约定:以其相关的字符集名开始, 通常包括⼀个语⾔名, 并且以_ci 、_cs 或 _bin 结束。
_ci : ⼤⼩写不敏感
_cs : ⼤⼩写敏感
_bin : binary collation ⼆元法, 直接⽐较字符的编码, 可以认为是区分⼤⼩写的, 因为字符集中'A'和'a'的编码显然不同。
/* 数据库默认的排序⽅式,是升序 */
create table t1(
  str char(1)
) charset=utf8mb4 collate=utf8mb4_general_ci; -- _general_ci 后缀的都是不区分⼤⼩写
create table t2(
  str char(1)
) charset=utf8mb4 collate=utf8mb4_bin; -- 看到后缀边是_bin的都是区分⼤⼩的
/*
Linux中Mysql是区分⼤⼩的
需要⾃⼰去配置
vim /etc/mysql/myf
到[mysqld]
1是不区分⼤⼩写,0是区分⼤⼩写
*/
lower_case_table_names=1
show character set; -- 查看字符集和校对集
show collation; -- 显⽰所有的校对集
3.MySQL的数据类型
3.1整型
⼀个⽆符号数⼀定是⾮负数
create table t3(
age tinyint unsigned
);
显⽰宽度 (zerofill),整型显⽰宽度, 位数不⾜时⽤ 0 填充
create table t4(
id int(10) zerofill primary key auto_increment,
name char(32)
);
insert into t4 values(12345, '5个');
insert into t4 values(1234567890, '10个');
insert into t4 values(123456789012, '12个');
select * from t4;
3.2浮点数
定点数的位数更加长使⽤⽅式:
float(M,D)
double(M,D)
decimal(M,D)
M 是⽀持多少个长度, D 是⼩数点后⾯的位数
create table t5 (
a float(10, 2),
b double(10, 2),
c decimal(10, 2)
);
3.3字符串类型
CHAR 与 VARCHAR 类型的区别
思考:
字符串、浮点型等都可以随意指定⼤⼩, 那么是不是平时操作的时候随意指定⼀个就可以呢?
答:不是, 数据类型并不是越⼤越好, 越⼤的类型会造成数据臃肿, 存储空间占⽤过⼤, 数据检索也会变慢
3.4枚举(enum)
字符串长度什么时候算0
多选⼀的时候使⽤的⼀种数据类型
在前端使⽤单选框的时候, 枚举类型可以发挥作⽤
枚举类型的优点:
1. 限制了可选值
2. 节省空间
3. 运⾏效率⾼
create table t6(
name varchar(32),
sex enum('男','⼥','保密') default'保密'
);
-
- 枚举类型的计数默认从1开始
insert into t6 set name='王宝强',sex=1;
3.5集合(set)(⽤的不多)
SET最多可以有64个不同的成员。类似于复选框, 有多少可以选多少。
create table t7 (
name varchar(32),
hobby set('吃','睡','玩','喝','抽')
);
insert into t7 values('张三','睡,抽,玩,吃,喝');
insert into t7 values('李四','睡,抽');
为什么不是⽤ set 类型?
在现代⽹站开发中, 多选框的值有上千个, 值存储的空间没有索引⽤的多
那复选框的问题怎么解决?
将复选框的值单独设计成⼀张表
3.6时间类型
3.6.1datetime
create table datetime_test (
create_at datetime
);
insert into datetime_test values('2019-4-2 16:54:00');
insert into datetime_test values('2019/4/2 16:54:00');
insert into datetime_test values(now());
-- 年份最⼤⽀持4个长度
insert into datetime_test values('10000/4/2 16:54:00'); -- 错误
insert into datetime_test values('9999/4/2 16:54:00');
3.6.2time
create table time_test (
create_at time
);
insert into time_test values('12:12:12');
insert into time_test values('100:12:12');
insert into time_test values('-100:12:12');
insert into time_test values('10 10:12:12');
-- 时间的范围是: [-838:59:59 - 838:59:59]
insert into time_test values('839:12:12'); -- 错误的
3.6.3timestamp 时间戳类型
时间戳类型在显⽰⽅⾯和datetime是⼀样的, 在存储上不⼀样范围从 1970-1-1 0:0:0 到 2038-1-19 11:14:07
时间戳使⽤ 4 个字节表⽰
该值⼤⼩与存储的位长有关: 2 ** (4 * 8 - 1)
create table timestamp_test (
create_time timestamp
);
insert into timestamp_test values(now());
insert into timestamp_test values('2038-1-19 11:14:07'); -- 时间戳最⼤值insert into timestamp_test values('2038-1-19 11:14:08'); -- 错误
3.6.4year
create table `year`(
create_at year
);
-- 从1900年开始 - 1900+255
insert into `year` values(now());
insert into `year` values('2155'); -- 年份最⼤值
insert into `year` values('2156'); -- 错误
3.7布尔值
mysql中的bool类型也是1和0。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。