6.1. mysql基本语法
INT类型¶
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)
自增
每张表一个
必须做主键
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)
- 自增主键建议使用bigint
数字类型float/double/decimal¶
float 暂用4字节 单精度 精确度低 double 暂用8字节 双精度 精确度低 decimal 变长 高精度 非常高 财务系统一般会使用
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个字节。
注意下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
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
时间格式¶
mysql5.6版本之后开始支持微妙,最大值为6
mysql> select now(6); +----------------------------+ | now(6) | +----------------------------+ | 2020-06-21 21:51:18.378109 | +----------------------------+ 1 row in set (0.00 sec)
主要却别是时区的区别
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