0
点赞
收藏
分享

微信扫一扫

MySQL系列之表和数据类型

自信的姐姐 2022-01-28 阅读 74

MySQL之表和数据类型

一. 查看数据库版本

select version();

二. 数据库操作

2.1. 创建数据库

create database if not exists test_db default charset utf8 collate utf8_general_ci;

这条SQL的含义是:如果数据库不存在则创建,存在则不创建,创建test_db数据库,并设定字符集为utf8和字符序为utf8_general_ci

2.2. 删除数据库

drop database test_db;

三. 字符集设置

在数据的存储上,MySQL提供了不同的字符集支持。而在数据的对比操作上,则提供了不同的字符序支持。

  • 字符集(character set):定义了字符以及字符的编码。
  • 排序规则(collation):定义了字符的比较规则。

举一个简单的例子:

有四个字符:A、B、a、b,这四个字符的编码分别是A = 0, B = 1, a = 2, b = 3。这里的字符 + 编码就构成了字符集(character set

如果要比较两个字符的大小,例如A、B,或者a、b,最直观的比较方式是采用它们的编码,比如因为0 < 1,所以 A < B;另外,对于A、a,虽然它们编码不同,但我们觉得大小写字符应该是相等的,也就是说 A == a

这上面定义了两条比较规则,这些比较规则的集合就是collation

  • 同样是大写字符、小写字符,则比较他们的编码大小
  • 如果两个字符为大小写关系,则它们相等

3.1. 查看字符集

show (character setcharset) [like 匹配模式]

在这里插入图片描述
每种字符集都有对应的默认排序规则。需要注意下Maxlen这个属性是表示每种字符集最多需要几个字节表示一个字符,下面看一下常见的字符集:

show character set where Charset in ('ascii', 'gb2312', 'gbk', 'utf8', 'utf8mb4')

在这里插入图片描述

3.2. 查看比较规则

一种字符集对应有多种比较规则。

show collation [like 匹配模式]

在这里插入图片描述

可以看到比较规则的属性还是挺多的,这里面挑选utf8mb4作为研究对象

show collation where Charset = 'utf8mb4'

在这里插入图片描述

先看一下排序规则的名称的定义规则:utf8mb4_xxxx_xx,这里大体可以分为三部分:

  • 比较规则的名称用关联字符集的名称开头
  • 接着第二部分就是比较规则对应的语言
  • 最后一部分是比较规则是否区分语言的重音、大小写等情况
    后缀含义后缀含义
    _ai不区分重音_cs分区大小写
    _as区分重音_bin以二进制比较
    _ci不分区大小写

一般情况选择:xxxx_gerneral_ci就可以,这是一种通用的比较规则。

3.3. 设置字符集

MySQL可以设置4个级别的字符集:服务器级别、数据库级别、表级别和列级别。

  • 服务器级别:
    MySQL服务器的配置文件可以指定:

    [mysqld]
    character-set-server=utf8mb4
    collation-server=utf8mb4_0900_ai_ci
    

    查看MySQL中的字符集和排序规则:

    show variables like 'character_set_server';  # 查看字符集
    show variables like 'collation_server';      # 查看排序规则
    
  • 数据库级别:
    创建数据库的时候指定字符集和比较规则:

    create database if not exists test_db_one default charset utf8 collate utf8_general_ci;
    

    创建之后查看字符集和比较规则:

    use test_db_one;
    show variables like 'character_set_database';  # 查看字符集:utf8mb3(utf8别名)
    show variables like 'collation_database';      # 排序规则:utf8_general_ci
    

    修改数据库的字符集和比较规则:

    alter database test_db_one default charset gbk collate gbk_chinese_ci;
    

    如果在创建的时候使用默认:create database xxx,此时就会使用服务器设置默认字符集和比较规则。

  • 表级别:
    建表的时候可以指定字符集和比较规则

    create table test_tab (
        id integer primary key
    ) default character set gbk collate gbk_chinese_ci;
    

    建好之后查看一下:

    show create table test_tab;
    

    在这里插入图片描述
    修改表的字符集和比较规则

    alter table test_tab character set utf8 collate utf8_general_ci;
    
  • 列级别:
    在创建表的时候可以单独指定每一列的字符集和比较规则

    create table test_tab_1 (
        id integer primary key,
        name varchar(20) character set utf8 collate utf8_general_ci,
        ....
    )
    

    修改列的字符集和比较规则

    alter table test_tab_1 modify name varchar(20) character set ascii collate ascii_general_ci;
    

    这里需要注意如果修改字符集可能会造成错误,例如上面原来name是utf8字符集改成ascii字符集,如果name中存储了中文字符,但是转成ascii字符集就无法表示,造成错误。

  • 只修改字符集,比较规则会修改为字符集默认的比较规则
  • 只修改比较规则,字符集就会修改为和比较规则对应的字符集

3.4. 扩展

这里需要注意下面三个字符集设置:

show variables like 'character_set_%';

在这里插入图片描述

变量含义
character_set_client客户端来源数据使用的字符集
character_set_connection连接层字符集
character_set_results查询结果字符集

设置方法:

set character_set_client = utf8mb4;  
set character_set_results = utf8mb4;   
set character_set_connection = utf8mb4;
# 简单设置,和上面三条效果一样
set names utf8mb4

也可以在配置文件中设置:

[mysqld]
character-set-server=utf8mb4
collation-server=utf8mb4_unicode_ci
[mysql]
default-character-set=utf8mb4
[client]
default-character-set=utf8mb4

上述字符集在使用的时候最好是一致的避免使用的MySQL在各种字符集之间的转换。

四. 表操作

关于表的操作上面已经基本介绍了。

4.1. 创建表

create table if not exists test_tab (
    id integer auto_increment primary key,
    name varchar(20) not null,
    sex binary default 0,
    birth date
) engine=InnoDB default character set utf8mb4 collate utf8mb4_unicode_ci;

这里面engine可以不指定默认是InnoDB,另外如果数据库指定的character set这里建表的时候也不需要指定。

建好之后查看一下表结构:

desc test_tab;

在这里插入图片描述

4.2. 修改表

修改表分为修改表设置和修改属性

alter table test_tab character set utf8 collate utf8_general_ci;  # 修改表设置

alter table test_tab modify name varchar(20) character set ascii collate ascii_general_ci;  # 修改属性
alter table test_tab add column name varchar(20) character set utf8;  # 增加属性
alter table test_tab drop column name;  # 删除属性


4.3. 删除、清空和重命名

删除表

drop table test_tab;

清空表:truncate是整体删除,并且不写log,也不会激活触发器

truncate table test_tab;

表重命名

rename table test_tab to test_aa;

五. 数据类型

5.1. 整型

类型字节范围(有符号)范围(无符号)备注
tinyint1-128,1270,255小整数值
smallint2-32768,327670,65535大整数值
mediumint3-8388608,83886070,16777215大整数值
int4大整数值
bigint8超大整数值

属性有符号和无符号:

create table if not exists test_tab (
    ......
    id integer,
    age int unsigned default 0,
    ......
)

5.2. 浮点型

类型字节备注
float4单精度浮点型
double8双精度浮点型
decimal精确小数值

decimal类型是MySQL官方唯一指定能精确存储的类型,推荐和金钱相关的类型都要存储为decimal类型,否则精度会丢失。

5.3. 字符

类型字节备注
char0-255字节定长字符串
varchar0-65535字节变长字符串
tinytext0-255字节短文本字符串
text0-65535字节长文本数据
longtext0-4294967295字节极长文本数据
tinyblob0-255字节二进制字符串
blob0-65535字节二进制形式的长文本数据
longblob0-4294967295字节二进制形式的极长文本数据

这里面需要注意:

  • blob类型主要用于存放二进制大对象,例如存储图片、音频、视频
  • char类型是定长的,长度不够的时候会通过右边填充空格以达到指定长度,当检索到char的值时,尾部空格被删除掉
  • varchar类型是存储可变长度字符串,存储时,字符没达到定义长度,也不会补空格。

5.4. 日期类型

类型字节格式备注
date3yyyy-MM-dd存储日期值
time3HH:mm:ss存储时分秒
yaer1yyyy存储年
datetime8yyyy-MM-dd HH:mm:ss存储日期+时间
timestamp4yyyy-MM-dd HH:mm:ss存储日期+时间,可作时间戳
举报

相关推荐

0 条评论