3. SQL 语言

重点:

MySQL 的 三种安装方式:包安装,二进制安装,源码编译安装。

MySQL 的 基本使用

MySQL 多实例

DDLcreate alter drop

DML insert update delete

DQL select

3)SQL 语言

3.1)关系型数据库的常见组件

数据库:database

表:table,行:row 列:column

索引:index

视图:view

存储过程:procedure

存储函数:function

触发器:trigger

事件调度器:event scheduler,任务计划

用户:user

权限:privilege

3.2)SQL 语言的兴起与语法标准

SQL( Structured Query Language )结构化查询语言 是对 IBM 公司 San Jose,California 研究实验室的埃德加·科德的关系模型的第一个商业化语言实现。

这一模型在其 1970 年的一篇具有影响力的论文《一个对于大型共享型数据库的关系模型》中被描述。

尽管 SQL 并非完全按照科德的关系模型设计,但其依然成为最为广泛运用的数据库语言

1970 年代初,由埃德加·科德发表将资料组成表格的应用原则(Codd's Relational Algebra)

1974 年,同一实验室的 D.D.Chamberlin和R.F. Boyce对Codd's Relational Algebra在研制关系数据库管理系统 System R 中,研制出一套规范语言-SEQUEL(Structured English Query Language)

1976 年 11 月的IBM Journal of R&D 上公布新版本的SQL(叫SEQUEL/2)。1980年改名为 SQL

1979 年 ORACLE 公司首先提供商用的 SQL,IBM 公司在 DB2 和 SQL/DS 数据库系统中也实现了 SQL

1986 年 10 月美国国家标准学会 ANSI 采用 SQL 作为关系数据库管理系统的标准语言(ANSI X3. 135-1986)

1987 年成为国际标准化组织(ISO)采纳为国际标准

1989 年美国 ANSI 采纳在 ANSI X3.135-1989 报告中定义的关系数据库管理系统的 SQL 标准语言,称为 ANSI SQL 89

后续 SQL 标准经过了一系列的增订,加入了大量新特性,有各种版本:ANSI SQL,SQL-1986,SQL-1989,SQL-1992, SQL-1999,SQL-2003,SQL-2008,SQL-2011

目前,所有主要的关系数据库管理系统支持某些形式的 SQL,大部分数据库至少遵守 ANSI SQL89 标准虽然有这一标准的存在,但大部分的 SQL 代码在不同的数据库系统中并不具有完全的跨平台性业内标准微软和 Sybase 的 T-SQL,Oracle 的 PL/SQL

3.2.1)SQL 语言规范

在数据库系统中,SQL 语句不区分大小写,建议用大写

SQL 语句可单行或多行书写,默认以 " ;" 结尾

关键词不能跨多行或简写 ( 比如:SELECT 这个你不能分成多行写 )

用空格和 TAB 缩进来提高语句的可读性

子句通常位于独立行,便于编辑,提高可读性

注释:

SQL 标准:

#单行注释, 注意有空格

-- 注释内容


#多行注释

/*注释内容

注释内容

注释内容*/


MySQL 注释:

# 注释内容

3.2.2)数据库对象和命名

数据库的组件(对象)

数据库、表、索引、视图、用户、存储过程、函数、触发器、事件调度器等

命名规则:

必须以字母开头,后续可以包括字母,数字和三个特殊字符(# _ $)

不要使用 MySQL 的保留字( 避免使用 MySQL 的关键字 )

3.2.3)SQL 语句分类

DDL:Data Defination Language( 数据定义语言 )

CREATE,DROP,ALTER

创建( 增 )

删除( 删 )

修改( 改 )

DML:Data Manipulation Language( 数据操纵语言 )

INSERT,DELETE,UPDATE

插入( 增 )

删除( 删 )

更新( 改 )

DQL:Data Query Language( 数据查询语言 )

SELECT

查询( 查 )

DCL:Data Control Language( 数据控制语言 )

GRANT,REVOKE

授权

TCL:Transaction Control Language( 事务控制语言 )

COMMIT,ROLLBACK,SAVEPOINT

3.2.4)SQL 语句构成

关健字 Keyword 组成子句 clause,多条 clause 组成语句

说明:一组 SQL 语句由三个子句构成,SELECT,FROM 和 WHERE 是关键字

SELECT *                 # SELECT 子句

FROM products            # FROM 子句

WHERE price>666          # WHERE 子句

获取 SQL 命令使用帮助:

官方帮助:MySQL :: MySQL 8.0 Reference Manual :: 13 SQL Statements

查看 SQL 帮助

mysql> HELP KEYWORD


'例如'

mysql> HELP SELECT

mysql> HELP CREATE

mysql> HELP CREATE DATABASE

3.2.5)字符集  排序规则

参考:滑动验证页面

MySQL 在创建数据库是,需要设置数据库的 字符集  排序规则,如图所示:

我觉得这里有必要解释下 字符集 排序规则 这两个概念。

说到字符集,需要先提下 字符字符集 字符编码 这几个词的含义。

字符(Character):是各种文字和符号的总称,包括各国家文字、标点符号、图形符号、数字等。

字符集(Character set):是多个字符的集合,字符集种类较多,每个字符集包含的字符个数不同,常见字符集名称:ASCII 字符集、GB2312 字符集、BIG5 字符集、 GB18030 字符集、Unicode 字符集等。

字符编码:是把字符集中的字符编码为特定的二进制数以便在计算机中存储。编码方式一般就是对二维表的横纵坐标进行变换的算法。一般都比较简单,直接把横纵坐标拼一起就完事了。后来随着字符集的不断扩大,为了节省存储空间,才出现了各种各样的算法。

排序规则

MySQL 中常用的排序规则( 这里以 utf8 字符集为例)主要有:utf8_general_ci、utf8_general_cs、utf8_unicode_ci 等。

这里需要注意下 ci cs 的区别:

ci 的完整英文是 'Case Insensitive',即 大小写不敏感,a 和 A 会在字符判断中会被当做一样的;

cs 的完整英文是 'Case Sensitive',即 大小写敏感,a 和 A 会有区分;

MySQL 有 4 个级别的 字符集 排序规则,分别是:

服务器级别( server ):可以通过设置 character_set_server 和 collation_server 统变量指定服务器字符集和排序规则;

数据库级别( database ):给数据库指定字符集和排序规则;

表级别( table ):可以指定表的字符集和排序规则;

列级别( column ):同一个表中不同的列也可以有不同的字符集和排序规则。

早期 MySQL 版本 默认字符集为 latin1

注意:从 MySQL8.0 开始默认字符集已经为 utf8mb4

UTF-8( 8-bit Unicode Transformation Format )是一种针对 Unicode 的可变长度字符编码,又称 万国码

utf8:简单的汉字存储

utf8mb4:存储 emoji 符号和一些比较复杂的汉字、繁体字

字符集

长度

说明

GBK

2

支持中文,但是不是国际通用字符集

UTF-8

3

支持中英文混合场景,是国际通用字符集

latin1

1

MySQL 默认字符集

utf8mb4

4

完全兼容 UTF-8,用四个字节存储更多的字符

查看当前 MySQL 中支持的 字符集

SHOW CHARSET;

Charset:字符集

Description:字段描述

Default collation:默认排序规则

Maxlen:该字符集支持的最大字符长度。

查看支持的所有 排序规则

SHOW COLLATION;

// 注意

utf8_general_ci     // 不区分大小写 ( utf8mb4 字符集的默认排序规则 )

utf8_bin            // 区分大小写

解析:

Collation:排序规则

Charset:字符集

Default:默认排序规则

因此:蓝色框选部分表示 big5 字符集有两个排序规则,当前 Big5 字符集的默认排序规则为 big5_chinese_ci

因此如下表示 utf8mb4 字符集有 23 个排序规则,当前 utf8mb4 字符集的默认排序规则为 utf8mb4_general_ci

查看 MySQL 数据库中 关于字符集 相关设置

SHOW VARIABLES LIKE 'char%';

MySQL 8.0 默认使用的 字符集 就是 utf8mb4

SHOW VARIABLES LIKE 'char%';

查看 当前使用 排序规则

SHOW VARIABLES LIKE 'collation%';

设置 MySQL 服务端 默认的字符集( 重要 )

vim /etc/my.cnf

 

// 针对 MySQL 服务端

[mysqld]

character-set-server=utf8mb4


// 重启服务

systemctl restart mariadb

设置 MySQL 客户端 默认的字符集( 重要 )

vim /etc/my.cnf

// 针对 MySQL 客户端

[mysql]

default-character-set=utf8mb4


// 针对所有 MySQL 客户端

[client]

default-character-set=utf8mb4


// 重启服务

systemctl restart mariadb

查看某个数据库的 默认字符集 信息

1. 创建数据库 db1

CREATE DATABASE db1;


2. 显示数据库 db1 的创建语句

SHOW CREATE DATABASE db1;

这个 db.opt 文件通常存储数据库的一些特定设置

比如 默认字符集排序规则存储引擎 等等。

cat /var/lib/mysql/db1/db.opt

范例:字符集 相关文件

mysql> SHOW CHARACTER SET;

+----------+---------------------------------+---------------------+--------+

| Charset  | Description                     | Default collation   | Maxlen |

+----------+---------------------------------+---------------------+--------+

| armscii8 | ARMSCII-8 Armenian              | armscii8_general_ci |      1 |

| ascii    | US ASCII                        | ascii_general_ci    |      1 |

| big5     | Big5 Traditional Chinese        | big5_chinese_ci     |      2 |

| binary   | Binary pseudo charset           | binary              |      1 |

| cp1250   | Windows Central European        | cp1250_general_ci   |      1 |

| cp1251   | Windows Cyrillic                | cp1251_general_ci   |      1 |

| cp1256   | Windows Arabic                  | cp1256_general_ci   |      1 |

| cp1257   | Windows Baltic                  | cp1257_general_ci   |      1 |

| cp850    | DOS West European               | cp850_general_ci    |      1 |

| cp852    | DOS Central European            | cp852_general_ci    |      1 |

| cp866    | DOS Russian                     | cp866_general_ci    |      1 |

| cp932    | SJIS for Windows Japanese       | cp932_japanese_ci   |      2 |

| dec8     | DEC West European               | dec8_swedish_ci     |      1 |

| eucjpms  | UJIS for Windows Japanese       | eucjpms_japanese_ci |      3 |

| euckr    | EUC-KR Korean                   | euckr_korean_ci     |      2 |

| gb18030  | China National Standard GB18030 | gb18030_chinese_ci  |      4 |

| gb2312   | GB2312 Simplified Chinese       | gb2312_chinese_ci   |      2 |

| gbk      | GBK Simplified Chinese          | gbk_chinese_ci      |      2 |

| geostd8  | GEOSTD8 Georgian                | geostd8_general_ci  |      1 |

| greek    | ISO 8859-7 Greek                | greek_general_ci    |      1 |

| hebrew   | ISO 8859-8 Hebrew               | hebrew_general_ci   |      1 |

| hp8      | HP West European                | hp8_english_ci      |      1 |

| keybcs2  | DOS Kamenicky Czech-Slovak      | keybcs2_general_ci  |      1 |

| koi8r    | KOI8-R Relcom Russian           | koi8r_general_ci    |      1 |

| koi8u    | KOI8-U Ukrainian                | koi8u_general_ci    |      1 |

| latin1   | cp1252 West European            | latin1_swedish_ci   |      1 |

| latin2   | ISO 8859-2 Central European     | latin2_general_ci   |      1 |

| latin5   | ISO 8859-9 Turkish              | latin5_turkish_ci   |      1 |

| latin7   | ISO 8859-13 Baltic              | latin7_general_ci   |      1 |

| macce    | Mac Central European            | macce_general_ci    |      1 |

| macroman | Mac West European               | macroman_general_ci |      1 |

| sjis     | Shift-JIS Japanese              | sjis_japanese_ci    |      2 |

| swe7     | 7bit Swedish                    | swe7_swedish_ci     |      1 |

| tis620   | TIS620 Thai                     | tis620_thai_ci      |      1 |

| ucs2     | UCS-2 Unicode                   | ucs2_general_ci     |      2 |

| ujis     | EUC-JP Japanese                 | ujis_japanese_ci    |      3 |

| utf16    | UTF-16 Unicode                  | utf16_general_ci    |      4 |

| utf16le  | UTF-16LE Unicode                | utf16le_general_ci  |      4 |

| utf32    | UTF-32 Unicode                  | utf32_general_ci    |      4 |

| utf8     | UTF-8 Unicode                   | utf8_general_ci     |      3 |

| utf8mb4  | UTF-8 Unicode                   | utf8mb4_0900_ai_ci  |      4 |

+----------+---------------------------------+---------------------+--------+

41 rows in set (0.01 sec)


[root@centos8 ~] ll /usr/share/mysql/charsets/

total 240

-rw-r--r--. 1 root root  5961 Jul  1  2021 armscii8.xml

-rw-r--r--. 1 root root  5947 Jul  1  2021 ascii.xml

-rw-r--r--. 1 root root  8676 Jul  1  2021 cp1250.xml

-rw-r--r--. 1 root root  8762 Jul  1  2021 cp1251.xml

-rw-r--r--. 1 root root  6010 Jul  1  2021 cp1256.xml

-rw-r--r--. 1 root root  9343 Jul  1  2021 cp1257.xml

-rw-r--r--. 1 root root  5947 Jul  1  2021 cp850.xml

-rw-r--r--. 1 root root  5963 Jul  1  2021 cp852.xml

-rw-r--r--. 1 root root  6054 Jul  1  2021 cp866.xml

-rw-r--r--. 1 root root  6970 Jul  1  2021 dec8.xml

-rw-r--r--. 1 root root  5957 Jul  1  2021 geostd8.xml

-rw-r--r--. 1 root root  6169 Jul  1  2021 greek.xml

-rw-r--r--. 1 root root  5952 Jul  1  2021 hebrew.xml

-rw-r--r--. 1 root root  5943 Jul  1  2021 hp8.xml

-rw-r--r--. 1 root root 19474 Jul  1  2021 Index.xml

-rw-r--r--. 1 root root  5970 Jul  1  2021 keybcs2.xml

-rw-r--r--. 1 root root  5951 Jul  1  2021 koi8r.xml

-rw-r--r--. 1 root root  6973 Jul  1  2021 koi8u.xml

-rw-r--r--. 1 root root 10251 Jul  1  2021 latin1.xml

-rw-r--r--. 1 root root  7673 Jul  1  2021 latin2.xml

-rw-r--r--. 1 root root  5950 Jul  1  2021 latin5.xml

-rw-r--r--. 1 root root  7879 Jul  1  2021 latin7.xml

-rw-r--r--. 1 root root  8488 Jul  1  2021 macce.xml

-rw-r--r--. 1 root root  8499 Jul  1  2021 macroman.xml

-rw-r--r--. 1 root root  1749 Jul  1  2021 README

-rw-r--r--. 1 root root  6971 Jul  1  2021 swe7.xml

范例:Mariadb10.3 默认的字符集和排序规则

MariaDB [(none)]> SELECT VERSION();

+-----------------+

| VERSION()       |

+-----------------+

| 10.3.17-MariaDB |

+-----------------+

1 row in set (0.000 sec)


MariaDB [(none)]> show variables like 'character%';

+--------------------------+------------------------------+

| Variable_name           | Value                       |

+--------------------------+------------------------------+

| character_set_client     | utf8                         |

| character_set_connection | utf8                         |

| character_set_database   | latin1                       |

| character_set_filesystem | binary                       |

| character_set_results   | utf8                         |

| character_set_server     | latin1                       |

| character_set_system     | utf8                         |

| character_sets_dir       | /usr/share/mariadb/charsets/ |

+--------------------------+------------------------------+

8 rows in set (0.003 sec)


MariaDB [(none)]> SHOW VARIABLES LIKE 'collation%';

+----------------------+-------------------+

| Variable_name       | Value             |

+----------------------+-------------------+

| collation_connection | utf8_general_ci   |  

| collation_database   | latin1_swedish_ci |

| collation_server     | latin1_swedish_ci |

+----------------------+-------------------+

3 rows in set (0.001 sec)

范例:MySQL 8.0 默认的字符集和排序规则

mysql> SELECT VERSION();

+-----------+

| VERSION() |

+-----------+

| 8.0.17   |

+-----------+

1 row in set (0.00 sec)


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       | /usr/share/mysql/charsets/ |

+--------------------------+----------------------------+

8 rows in set (0.01 sec)


mysql> show variables like 'collation%';

+----------------------+--------------------+

| Variable_name        | Value              |

+----------------------+--------------------+

| collation_connection | utf8mb4_0900_ai_ci |

| collation_database   | utf8mb4_0900_ai_ci |

| collation_server     | utf8mb4_0900_ai_ci |

+----------------------+--------------------+

3 rows in set (0.00 sec)

3.3)管理数据库

3.3.1)创建数据库

CREATE

CREATE DATABASE|SCHEMA [IF NOT EXISTS] 'DB_NAME'

CHARACTER SET 'character set name'

COLLATE 'collate name';

范例:

// 不指定字符集创建数据库 ( 低版本 MySQL 数据库会默认使用 latin1 字符集 )

MariaDB [(none)]> create database db1;

Query OK, 1 row affected (0.001 sec)

// 查看指定数据库字符集信息

MariaDB [(none)]> show create database db1;

+----------+----------------------------------------------------------------+

| Database | Create Database                                                |

+----------+----------------------------------------------------------------+

| db1      | CREATE DATABASE `db1` /*!40100 DEFAULT CHARACTER SET latin1 */ |

+----------+----------------------------------------------------------------+

1 row in set (0.000 sec)


// 也可以使用该方式查看

[root@centos7 ~] cat /var/lib/mysql/db1/db.opt

default-character-set=latin1

default-collation=latin1_swedish_ci


// 创建已经存在的数据库名称 ( 报错 )

MariaDB [(none)]> create database db1;

ERROR 1007 (HY000): Cant create database 'db1'; database exists


// 我们可以使用如下方法创建

// 关键字 IF NOT EXISTS 的作用

// 是在执行创建数据库的操作之前检查数据库是否已经存在, 如果数据库已经存在

// 则不会执行创建操作, 避免出现重复创建同名数据库的错误.

MariaDB [(none)]> create database IF NOT EXISTS db1;

Query OK, 0 rows affected, 1 warning (0.001 sec)


MariaDB [(none)]> show warnings;

+-------+------+----------------------------------------------+

| Level | Code | Message                                     |

+-------+------+----------------------------------------------+

| Note | 1007 | Can't create database 'db1'; database exists |

+-------+------+----------------------------------------------+

1 row in set (0.000 sec)

范例:指定字符集 创建新数据库

// 指定字符集 创建新数据库

MariaDB [(none)]> create database IF NOT EXISTS db2 CHARACTER SET 'utf8';

Query OK, 1 row affected (0.000 sec)


// 查看指定数据库字符集信息

MariaDB [(none)]> SHOW CREATE DATABASE db2;

+----------+--------------------------------------------------------------+

| Database | Create Database                                              |

+----------+--------------------------------------------------------------+

| db2      | CREATE DATABASE `db2` /*!40100 DEFAULT CHARACTER SET utf8 */ |

+----------+--------------------------------------------------------------+

1 row in set (0.00 sec)


// 也可以使用该方式查看

[root@centos7 ~] cat /var/lib/mysql/db2/db.opt

default-character-set=utf8

default-collation=utf8_general_ci


// 可以用以下简写    ( 建议 )

mysql> create database test1 charset=utf8;

Query OK, 1 row affected, 1 warning (0.00 sec)


// 查看指定数据库字符集信息

MariaDB [(none)]> show create database test1;

+----------+----------------------------------------------------------------+

| Database | Create Database                                                |

+----------+----------------------------------------------------------------+

| test1    | CREATE DATABASE `test1` /*!40100 DEFAULT CHARACTER SET utf8 */ |

+----------+----------------------------------------------------------------+

1 row in set (0.00 sec)

范例:手动创建数据库

指定了数据库的字符集UTF-8

指定了数据库的排序规则utf8_bin

因此,这条命令将创建一个名为 zabbix 的数据库,使用 UTF-8 字符集存储数据,并使用区分大小写的二进制排序规则。

mysql> create database zabbix character set utf8 collate utf8_bin;

范例:以容器方式启动并创建数据库

[root@centos8 ~] docker run --name mysql-server -t \

      -e MYSQL_DATABASE="zabbix" \

      -e MYSQL_USER="zabbix" \

      -e MYSQL_PASSWORD="zabbix_pwd" \

      -e MYSQL_ROOT_PASSWORD="root_pwd" \

      -d mysql:5.7 \

      --character-set-server=utf8 --collation-server=utf8_bin

      

[root@centos8 ~] docker run -d -p 3306:3306 --name mysql \

    -e MYSQL_ROOT_PASSWORD=123456 \

    -e MYSQL_DATABASE=jumpserver

    -e MYSQL_USER=jumpserver

    -e MYSQL_PASSWORD=123456  

    -v /data/mysql:/var/lib/mysql

    -v /etc/mysql/mysql.conf.d/mysqld.cnf:/etc/mysql/mysql.conf.d/mysqld.cnf \

    -v /etc/mysql/conf.d/mysql.cnf:/etc/mysql/conf.d/mysql.cnf

    mysql:5.7.30

3.3.2)修改数据库

ALTER

ALTER DATABASE DB_NAME character set utf8;

范例:

// 修改名为 db1 的数据库的字符集嘻嘻和排序规则

MariaDB [(none)]> ALTER DATABASE db1 character set utf8 COLLATE utf8_bin;

Query OK, 1 row affected (0.001 sec)


// 验证

MariaDB [(none)]> show create database db1;

+----------+-------------------------------------------------------------------------------+

| Database | Create Database                                                               |

+----------+-------------------------------------------------------------------------------+

| db1      | CREATE DATABASE `db1` /*!40100 DEFAULT CHARACTER SET utf8 COLLATE utf8_bin */ |

+----------+-------------------------------------------------------------------------------+

1 row in set (0.00 sec)


// 验证

[root@centos7 ~] cat /var/lib/mysql/db1/db.opt

default-character-set=utf8

default-collation=utf8_bin

3.3.3)删除数据库

DROP

DROP DATABASE|SCHEMA [IF EXISTS] 'DB_NAME';

// 删库

MariaDB [(none)]> drop database db1;

Query OK, 0 rows affected (0.002 sec)


// 跑路 

MariaDB [(none)]> show databases;

+--------------------+

| Database           |

+--------------------+

| information_schema |

| mysql              |

| performance_schema |

+--------------------+

3 rows in set (0.000 sec)


// 数据库文件夹也随之消失

[root@centos7 ~] ls /var/lib/mysql/

3.3.4)查看数据库列表

SHOW

SHOW DATABASES;

范例:

MariaDB [(none)]> show databases;

+--------------------+

| Database           |

+--------------------+

| information_schema |

| mysql              |

| performance_schema |

+--------------------+

3 rows in set (0.000 sec)

3.4)数据类型

注意:每个文字占用几个字节与所使用的字符集类型有关。

数据类型

数据长什么样

数据需要多少空间来存放

数据类型

系统内置数据类型

用户定义数据类型

MySQL 支持多种内置数据类型

数值类型

日期/时间类型

字符串(字符)类型

数据类型参考链接:MySQL :: MySQL 8.0 Reference Manual :: 11 Data Types

选择正确的数据类型对于获得高性能至关重要,三大原则:

更小的通常更好,尽量使用可正确存储数据的最小数据类型

简单就好,简单数据类型的操作通常需要更少的 CPU 周期

尽量避免 NULL,包含为 NULL 的列,对 MySQL 更难优化

3.4.1)整数型

tinyint(m) 1 个字节范围( -128~127 )0 ~ 255举例:年

smallint(m)2 个字节范围( -32768~32767 )0 ~ 65535举例:端口

mediumint(m)3 个字节范围( -8388608~8388607 )0 ~ 16777215举例:年薪

int(m) 4 字节范围( -2147483648~2147483647 )0 ~ 4294967295

bigint(m) 8 个字节范围( +-9.22*10 的 18 次方 )

注意:上述数据类型,如果加修饰符 unsigned 后,则最大值翻倍。

如:tinyint unsigned 的取值范围为( 0 ~ 255 )

int(m)里的 m 是表示 SELECT 查询结果集中的显示宽度,并不影响实际的取值范围,规定了 MySQL 的一些交互工具( 例如 MySQL 命令行客户端 )用来显示字符的个数。对于存储和计算来说,Int(1)和 Int(20)是相同的 BOOL,BOOLEAN:布尔型,是 TINYINT(1)的同义词。zero 值被视为假,非 zero 值视为真。

3.4.2)浮点型( float 和 double ),近似值

float(m,d)单精度浮点型 8 位精度(4字节) m 总个数,d 小数位

注意:小数点不占用总个数

double(m,d)双精度浮点型 16 位精度( 8字节)m 总个数,d 小数位

注意:小数点不占用总个数

设一个字段定义为 float(6,3),如果插入一个数 123.45678,实际数据库里存的是123.457,但总个数还以实际为准,即 6 位。

3.4.3)定点数

在数据库中存放的是精确值,存为十进制。

格式 decimal(m,d) 表示:最多 m 位数字,其中 d 个小数,小数点不算在长度内。

比如:DECIMAL(6,2)总共能存 6 位数字,末尾 2 位是小数,字段最大值 9999.99( 小数点不算在长度内 )参数 m<65 是总个数,d<30 且  d<m 是小数位。

MySQL5.0 和更高版本将数字打包保存到一个二进制字符串中( 每 4 个字节存 9 个数字 )。

例如:decimal(18,9)小数点两边将各存储 9 个数字,一共使用 9 个字节:其中,小数点前的 9 个数字用 4 个字节,小数点后的 9 个数字用 4 个字节,小数点本身占 1 个字节。

浮点类型在存储同样范围的值时,通常比 decimal 使用更少的空间。float 使用 4 个字节存储。double 占用 8 个字节。

因为需要额外的空间和计算开销,所以应该尽量只在对小数进行精确计算时才使用 decimal,例如存储财务数据。但在数据量比较大的时候,可以考虑使用 bigint 代替 decimal。

3.4.4)字符串(char,varchar,text)

char(n)固定长度,最多 255 个字符,注意不是字节

varchar(n) 可变长度,最多 65535 个字符

tinytext 可变长度,最多 255 个字符

text 可变长度,最多 65535 个字符

mediumtext 可变长度,最多 2 的 24 次方 -1 个字符

longtext 可变长度,最多 2 的 32 次方 -1 个字符

BINARY(M)固定长度,可存二进制或字符,长度为 0-M 字节

VARBINARY(M)可变长度,可存二进制或字符,允许长度为 0-M 字节

内建类型:ENUM 枚举,SET集合

char 和 varchar 的比较:

参考:MySQL :: MySQL 8.0 Reference Manual :: 11.3.2 The CHAR and VARCHAR Types

对于 CHAR 类型:

使用 固定长度 存储数据,无论实际存入多少字符,都将占用固定数量的存储空间。比如 CHAR(4) 类型无论存入几个字符,都会占用 4 个字节。

当存入的字符串长度少于指定长度时,系统会自动用空格填充至指定长度。

查询时末尾的空格会被自动去除,因此 CHAR 类型的字符串末尾不能包含空格。

由于是固定长度,对于定长数据的查询速度通常比 VARCHAR 类型更快。

对于 VARCHAR 类型:

存储长度是可变的,根据实际存入的字符数加 1 个字节来计算存储空间。

由于是可变长度,不会自动填充空格,允许末尾有空格。

查询时末尾的空格不会被去除。

节省存储空间,但可能因为变长而在某些情况下对查询速度稍慢一些。

char 类型 与 varchar 类型 的区别

char 类型是 固定长度[ 根据定义的字符串长度分配足够的空间 ]不够灵

varchar 类型是 可变长度的[ 只使用字符串长度所需要的空间 ]灵活

比如:保存字符串 " abc "

以我们 指定字段字符串长度为 10 字节 为例

char  占用 10 个字节

varchar 仅占用 3 + 1 个字节

( 适用场景 )

varchar 和 text

面试题:varchar(50) 能存放几个 UTF8 编码的汉字?

MySQL 5.0 以上版本, varchar(50) 指的是 50 字符, 无论存放的是数字, 字母还是 UTF8 编码的汉字, 都可以存放 50 个

// 存放的汉字个数与版本相关

1) mysql 4.0 以下版本, varchar(50) 指的是 50 字节, 如果存放 UTF8 格式编码的汉字时 (每个汉字 3 字

节), 只能存放 16 个.

2) mysql 5.0 以上版本, varchar(50) 指的是 50 字符, 无论存放的是数字, 字母还是 UTF8 编码的汉字, 都可以存放 50 个.

3.4.5)二进制数据 BLOB

BLOB 和 TEXT 存储方式不同,TEXT 以文本方式存储,英文存储区分大小写,而 Blob 以二进制方式存储,不分大小写。

BLOB 存储的数据只能整体读出。

TEXT 可以指定字符集,BLOB 不用指定字符集。

3.4.6)日期时间类型

date 日期 '2008-12-2'

time 时间 '12:25:36'

datetime 日期时间 '2008-12-2 22:06:44'

timestamp 自动存储记录修改时间

YEAR(2),YEAR(4):年份

timestamp 此字段里的时间数据会随其他字段修改的时候自动刷新,这个数据类型的字段可以存放这条记录最后被修改的时间。

3.4.7)修饰符

适用所有类型的修饰符:( 用来定义字段 )

NULL 数据列 可包含 NULL 值

举例:年龄

NULL 允许为空

NOT NULL 数据列 不允许包含 NULL 值

相当于网站注册表中的 * 为必填选项

举例:姓名

NOT NULL 不允许为空

DEFAULT 默认值

举例:性别

DEFAULT 设置默认值

比如:不手动指定性别,默认会设置为 男性

PRIMARY KEY 主键,所有记录中此字段的值不能重复,且不能为 NULL

UNIQUE KEY 唯一键,所有记录中此字段的值不能重复,但可以为 NULL

CHARACTER SET name 指定一个字符集

适用数值型的修饰符:

AUTO_INCREMENT 自动递增,适用于整数类型。必须作用于某个 key 的字段,比如 primary key。( 举例:ID 号 )

UNSIGNED 无符号( 在整数型段落有举例 )

范例:关于 AUTO_INCREMENT

MariaDB [hellodb]> SHOW VARIABLES LIKE 'auto_inc%';

+--------------------------+-------+

| Variable_name            | Value |

+--------------------------+-------+

| auto_increment_increment | 1     |

| auto_increment_offset    | 1     |

+--------------------------+-------+

2 rows in set (0.001 sec)


// auto_increment_offset 定义初始值

// auto_increment_increment 定义步进

范例:

mysql> create database test;

Query OK, 1 row affected (0.00 sec)


mysql> use test

Database changed


mysql> create table t1(id int unsigned auto_increment primary key)

 auto_increment = 4294967294;

Query OK, 0 rows affected (0.01 sec)


MariaDB [db1]> show table status from db1 like "t1" \G

*************************** 1. row ***************************

           Name: t1

          Engine: InnoDB

         Version: 10

      Row_format: Dynamic

           Rows:  0

  Avg_row_length: 0

     Data_length: 16384

 Max_data_length: 0

   Index_length:  0

       Data_free: 0

  Auto_increment: 4294967294

     Create_time: 2021-01-29 16:22:00

     Update_time: NULL

     Check_time:  NULL

       Collation: latin1_swedish_ci

        Checksum: NULL

 Create_options:

         Comment:

Max_index_length: 0

       Temporary: N

1 row in set (0.000 sec)


MariaDB [db1]>

mysql> insert into t1 values(null);

Query OK, 1 row affected (0.01 sec)


mysql> select * from t1;

+------------+

| id         |

+------------+

| 4294967294 |

+------------+

1 row in set (0.00 sec)


mysql> insert into t1 values(null);                                

Query OK, 1 row affected (0.00 sec)


mysql> select * from t1;

+------------+

| id         |

+------------+

| 4294967294 |

| 4294967295 |

+------------+

2 rows in set (0.00 sec)


mysql> insert into t1 values(null);                                

ERROR 1062 (23000): Duplicate entry '4294967295' for key 'PRIMARY'


MariaDB [testdb]> insert t1 value(null);

ERROR 167 (22003): Out of range value for column 'id' at row 1


# 上面表的数据类型无法存放所有数据,修改过数据类型实现

MariaDB [db1]> alter table t1 modify id bigint auto_increment;

Query OK, 2 rows affected (0.023 sec)

Records: 2 Duplicates: 0  Warnings: 0


MariaDB [db1]> desc t1;

+-------+------------+------+-----+---------+----------------+

| Field | Type       | Null | Key | Default | Extra          |

+-------+------------+------+-----+---------+----------------+

| id    | bigint(20) | NO   | PRI | NULL    | auto_increment |

+-------+------------+------+-----+---------+----------------+

1 row in set (0.001 sec)


MariaDB [db1]> insert t1 values(null);

Query OK, 1 row affected (0.001 sec)


MariaDB [db1]> select * from t1;

+------------+

| id         |

+------------+

| 4294967294 |

| 4294967295 |

| 4294967296 |

+------------+

3 rows in set (0.000 sec)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/353344.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

[晓理紫]每日论文分享(有中文摘要,源码或项目地址)--强化学习、模仿学习、机器人、开放词汇

专属领域论文订阅 关注{晓理紫|小李子}&#xff0c;每日更新论文&#xff0c;如感兴趣&#xff0c;请转发给有需要的同学&#xff0c;谢谢支持 如果你感觉对你有所帮助&#xff0c;请关注我&#xff0c;每日准时为你推送最新论文。 分类: 大语言模型LLM视觉模型VLM扩散模型视觉…

JVM工作原理与实战(二十九):监控内存泄漏的工具

专栏导航 JVM工作原理与实战 RabbitMQ入门指南 从零开始了解大数据 目录 专栏导航 前言 一、解决内存溢出的步骤 二、发现问题 1.Top命令 2.VisualVM 3.Arthas 4.Prometheus Grafana 总结 前言 JVM作为Java程序的运行环境&#xff0c;其负责解释和执行字节码&#x…

PyInstaller 将 Python 程序生成可直接运行的程序

图标转换地址&#xff1a;https://convert.app/#google_vignette 官方文档&#xff1a;https://readthedocs.org/projects/pyinstaller/downloads/pdf/stable/#page20 安装pyinstaller pip install pyinstaller执行打包 pyinstaller -i ./resource/w.icns -w -F whv.py --a…

VsCode CMake调试QT QString等变量不显示具体值,调试中查看qt源码 (可视化调试配置Natvis)

遇到的问题 当我们在VsCode使用CMake来调试QT程序时&#xff0c;可能会出现变量是十六进制的地址&#xff0c;而看不到具体的值。例如&#xff1a; 如何解决 这时候需要手动设置一下natvis &#xff08;资源以上传&#xff0c;可以直接下载&#xff09; 在.vscode文件下找到…

Ribbon 体系架构解析

前面已经介绍了服务治理相关组件&#xff0c;接下来趁热打铁&#xff0c;快速通关Ribbon&#xff01;前面我们了解了负载均衡的含义&#xff0c;以及客户端和服务端负载均衡模型&#xff0c;接下来我们就来看下SpringCloud 下的客户端负载均衡组件Ribbon 的特点以及工作模型。 …

uniapp微信小程序-请求二次封装(直接可用)

一、请求封装优点 代码重用性&#xff1a;通过封装请求&#xff0c;你可以在整个项目中重用相同的请求逻辑。这样一来&#xff0c;如果 API 发生变化或者需要进行优化&#xff0c;你只需在一个地方修改代码&#xff0c;而不是在每个使用这个请求的地方都进行修改。 可维护性&a…

P8651 [蓝桥杯 2017 省 B] 日期问题

#include <iostream> #include <string> using namespace std;int first; int second; int third; int day[13]{0,31,0,31,30,31,30,31,31,30,31,30,31};//每月日期bool select (int i,int j,int k){if ((i%100 first) && (j second) && (k thi…

Spring Cloud + Vue前后端分离-第13章 网站开发

源代码在GitHub - 629y/course: Spring Cloud Vue前后端分离-在线课程 Spring Cloud Vue前后端分离-第13章 网站开发 13-1 网站模块的搭建 新建web模板 1.网站开发&#xff0c;增加web模块&#xff0c;使用命令&#xff1a;vue create web vue版本4.2.3 大家拿到一个v…

第七篇【传奇开心果短博文系列】Python的OpenCV库技术点案例示例:图像拼接和融合

传奇开心果短博文系列 系列短博文目录Python的OpenCV库技术点案例示例短博文系列 短博文目录一、前言二、OpenCV图像拼接融合介绍三、全景图像拼接示例代码和扩展四、图像融合示例代码和扩展五、归纳总结 系列短博文目录 Python的OpenCV库技术点案例示例短博文系列 短博文目录…

el-table 设置内容超出宽度后省略,并添加tooltip

el-table 设置内容超出宽度后省略&#xff0c;并添加tooltip 只需要在el-table-item 标签中添加属性 :show-overflow-tooltip"true" 例子 <template><div style"width:100%; display: flex; justify-content: center;"><el-table :data&…

零基础学习数学建模——(五)美赛写作指导

本篇博客将详细讲解美赛论文写作。 文章目录 标题摘要目录引言问题背景问题重述前人研究我们的工作 模型假设及符号说明正文问题分析模型建立模型求解结果分析模型检验 模型优缺点及展望模型优缺点模型展望 参考文献及附录参考文献附录 2024年美赛论文新要求 标题 标题要简洁…

探索 SOAP:揭开 Web 服务的神秘面纱(上)

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

vscode配置扩展

1、微软提供的C/C扩展开发包 2、C/C智能提示 3、提供as汇编的语法高亮 4、提供文件夹和文件的显示主题 5、提供链接脚本的语法高亮 6、十六进制编辑器 7、MakeFile工具

Bug: git stash恢复误drop的提交

Bug: git stash恢复误drop的提交 前几天在写ut时突然需要通过本地代码临时出一个包&#xff0c;但是本地ut又不想直接作为一个commit提交&#xff0c;所以为了省事就将ut的代码暂时stash起来。出完包后想apply stash&#xff0c;但是手误操作点成了drop stash&#xff0c;丢失了…

Adobe ColdFusion 反序列化漏洞复现(CVE-2023-38203)

0x01 产品简介 Adobe ColdFusion是美国奥多比(Adobe)公司的一套快速应用程序开发平台。该平台包括集成开发环境和脚本语言。 0x02 漏洞概述 Adobe ColdFusion存在代码问题漏洞,该漏洞源于受到不受信任数据反序列化漏洞的影响,攻击者通过漏洞可以代码执行,可导致服务器失…

五个工业安全物联网解决方案

新一代物联网工具和应用正在帮助改变工业安全现状。传感器、可穿戴设备和位置标签提供实时数据&#xff0c;可以防止发生事故&#xff0c;并在出现故障时极大地缩短响应时间。 工业工作场所需要更加安全。根据国际劳工组织的数据&#xff0c;全球每年有近4亿工人因工受伤。近30…

matplotlib 波士顿房价数据及可视化 Tensorflow 2.4.0

matplotlib 波士顿房价数据及可视化 Tensorflow 2.4.0 目录 matplotlib 波士顿房价数据及可视化 Tensorflow 2.4.0 1. 认识 1.1 kears 1.2 kears常用数据集 2. 波士顿房价数据及可视化 2.1 下载波士顿房价数据集 2.2 展示一个属性对房价的影响 2.3 将是三个属性全部展…

【JavaSE篇】——数组的定义与使用

目录 本章的目标&#xff1a; &#x1f388;数组的基本概念 &#x1f36d;创建数组 &#x1f36d;数组的初始化 &#x1f36d;数组的使用 &#x1f449;数组中元素访问 &#x1f449;遍历数组 &#x1f388;数组是引用类型 &#x1f36d;初始JVM的内存分布 &#x1f…

SU-03T语音控制模块详解

当我们谈到智能家居时&#xff0c;经常会通过语音来控制我们的家电&#xff0c;将「懒」发挥到极致。语音模块结合了语音识别和控制技术&#xff0c;使得我们可以通过简单的口令来轻松操控灯光等设备&#xff0c;实现更智能化的生活体验。 在本文中&#xff0c;我们将探讨如何…

12.Elasticsearch应用(十二)

Elasticsearch应用&#xff08;十二&#xff09; 1.单机ES面临的问题 海量数据存储问题单点故障问题 2.ES集群如何解决上面的问题 海量数据存储解决问题&#xff1a; 将索引库从逻辑上拆分为N个分片&#xff08;Shard&#xff09;&#xff0c;存储到多个节点单点故障问题&a…
最新文章