跳转至

6.1. mysql基本语法

INT类型

hello

unsigned/signed(无符号、有符号)

zerofill

  • 显示属性

  • 值不做任何修改

int(N) N只是代表填充0的个数,无特殊含义

mysql> create table tt (a int(5) zerofill);
Query OK, 0 rows affected (0.03 sec)

mysql> insert into tt select 1;
Query OK, 1 row affected (0.01 sec)
Records: 1  Duplicates: 0  Warnings: 0

mysql> select * from tt;
+-------+
| a     |
+-------+
| 00001 |
+-------+
1 row in set (0.00 sec)

mysql> insert into tt select 111111;
Query OK, 1 row affected (0.00 sec)
Records: 1  Duplicates: 0  Warnings: 0

mysql> select * from tt;
+--------+
| a      |
+--------+
|  00001 |
| 111111 |
+--------+
2 rows in set (0.00 sec)
- auto_increment

自增

每张表一个

必须做主键

mysql> create table tt (a int(5) auto_increment primary key);
Query OK, 0 rows affected (0.03 sec)
mysql> desc tt;
+-------+--------+------+-----+---------+----------------+
| Field | Type   | Null | Key | Default | Extra          |
+-------+--------+------+-----+---------+----------------+
| a     | int(5) | NO   | PRI | NULL    | auto_increment |
+-------+--------+------+-----+---------+----------------+
1 row in set (0.01 sec)
- action:推荐不要使用unsigned

  • 自增主键建议使用bigint

数字类型float/double/decimal

float 暂用4字节 单精度 精确度低
double 暂用8字节 双精度 精确度低
decimal 变长 高精度 非常高 财务系统一般会使用
float(M,D)M代表显示总位数,D代表小数点之后几位,小数点超出会四舍五入. decimal如果不指定默认是(10,0)
create table tt (a float(5,3));
insert into tt select 111.12;
insert into tt select 1;
insert into tt select 1.0;
insert into tt select 11.1;
mysql> select * from tt ;
+--------+
| a      |
+--------+
|  1.100 |
| 11.100 |
| 11.111 |
|  1.000 |
|  1.000 |
|  1.000 |

字符串类型

字符与字节

(一)“字节”的定义
字节(Byte)是一种计量单位,表示数据量多少,它是计算机信息技术用于计量存储容量的一种计量单位。

(二)“字符”的定义
字符是指计算机中使用的文字和符号,比如1、2、3、A、B、C、~!·#¥%……—*()——+、等等。

(三)“字节”与“字符”的区别
它们完全不是一个位面的概念,所以两者之间没有“区别”这个说法。
不同编码里,字符和字节的对应关系不同:
①ASCII码中:一个英文字母(不分大小写)占一个字节的空间,一个中文汉字占两个字节的空间。
一个二进制数字序列,在计算机中作为一个数字单元,一般为8位二进制数,换算为十进制。最小值0,最大值255。

②UTF-8编码中:一个英文字符等于一个字节,一个中文(含繁体)等于三个字节。

③Unicode编码中:一个英文字符等于两个字节,一个中文(含繁体)等于两个字节。
      符号:英文标点占一个字节;中文标点占两个字节。
      举例:英文句号“.”占1个字节的大小;中文句号“。”占2个字节的大小。

④UTF-16编码中:一个英文字母字符或一个汉字字符存储都需要2个字节(Unicode扩展区的一些汉字存储需要4个字节)。

⑤UTF-32编码中:世界上任何字符的存储都需要4个字节。

xx

注意下varchar/char与其他的区别,他们括号的N代表的是字符

常见字符集utf-8 utfmb4 gbk

查看当前版本支持的字符集

show character set;
+----------+---------------------------------+---------------------+--------+
| Charset  | Description                     | Default collation   | Maxlen |
+----------+---------------------------------+---------------------+--------+
| big5     | Big5 Traditional Chinese        | big5_chinese_ci     |      2 |
| dec8     | DEC West European               | dec8_swedish_ci     |      1 |
| cp850    | DOS West European               | cp850_general_ci    |      1 |
| hp8      | HP West European                | hp8_english_ci      |      1 |
| koi8r    | KOI8-R Relcom Russian           | koi8r_general_ci    |      1 |
| latin1   | cp1252 West European            | latin1_swedish_ci   |      1 |
字符集排序规则(不区分大小写,以及包含空字符)
4种情况
mysql> select 'a'='a';
+---------+
| 'a'='a' |
+---------+
|       1 |
+---------+
1 row in set (0.00 sec)

mysql> select 'a'='A';
+---------+
| 'a'='A' |
+---------+
|       1 |
+---------+
1 row in set (0.00 sec)

mysql> select 'a'='a   ';
+------------+
| 'a'='a   ' |
+------------+
|          1 |
+------------+
1 row in set (0.00 sec)

mysql> select 'a'=' A   ';
+-------------+
| 'a'=' A   ' |
+-------------+
|           0 |
+-------------+
1 row in set (0.00 sec)

mysql> select 'a'='A   ';
+------------+
| 'a'='A   ' |
+------------+
|          1 |
+------------+
1 row in set (0.00 sec)
查看字符集排序规则

show collation;
| utf8mb4_general_ci       | utf8mb4  |  45 | Yes     | Yes      |       1 |
| utf8mb4_bin              | utf8mb4  |  46 |         | Yes      |       1 |

带ci的第一种是不区分大小写及空格,就是上边的情况
第二种是区分的
区分大小写情况
mysql> set names utf8mb4 collate utf8mb4_bin;
Query OK, 0 rows affected (0.00 sec)

mysql> select 'a'='A';
+---------+
| 'a'='A' |
+---------+
|       0 |
+---------+
1 row in set (0.00 sec)
- 字符编码设置

1 服务器配置设置:character_set_server=utf8mb4

2 创建数据库指定:

CREATE TABLE `tt` (
  `a` char(10) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb
3 创建表时也可以指定
CREATE TABLE `tt` (
  `a` char(10) DEFAULT NULL CHARSET=utf8mb,
  `b` char(10) DEFAULT NULL CHARSET=gbk
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb

ENUM set

  • 集合类型

  • ENUM最多准许65536个值

  • set最多64个值

  • sql_mode可以约束检查

简单使用

mysql> create table gg (sex enum('female','man'));
Query OK, 0 rows affected (0.03 sec)
mysql> set sql_mode='STRICT_TRANS_TABLES'; #严格校验
mysql> insert into gg select('female');
Query OK, 1 row affected (0.01 sec)
Records: 1  Duplicates: 0  Warnings: 0

mysql> insert into gg select('xxx');
ERROR 1265 (01000): Data truncated for column 'sex' at row 1

时间格式

cc

mysql5.6版本之后开始支持微妙,最大值为6

mysql> select now(6);
+----------------------------+
| now(6)                     |
+----------------------------+
| 2020-06-21 21:51:18.378109 |
+----------------------------+
1 row in set (0.00 sec)
- timestamp与datetime区别

主要却别是时区的区别

mysql> insert into ff select now(),now();
Query OK, 1 row affected (0.00 sec)
Records: 1  Duplicates: 0  Warnings: 0

mysql> select * from ff;
+---------------------+---------------------+
| a                   | b                   |
+---------------------+---------------------+
| 2020-06-21 21:53:47 | 2020-06-21 21:53:47 |
+---------------------+---------------------+
1 row in set (0.00 sec)

mysql> set time_zone="+00:00";
Query OK, 0 rows affected (0.00 sec)

mysql> select * from ff;
+---------------------+---------------------+
| a                   | b                   |
+---------------------+---------------------+
| 2020-06-21 13:53:47 | 2020-06-21 21:53:47 |
+---------------------+---------------------+
1 row in set (0.00 sec)

时间相差8h