1,创建数据库时指定名字和字符集
CREATE DATABASE IF NOT EXISTS dbtest CHARACTER SET 'utf8mb4' ;
SHOW CREATE DATABASE dbtest;
2,创建表时指定名字和字符集
CREATE TABLE temp(
id INT
name VARCHAR(15) CHARACTER SET 'gbk' 字段的字符集可以指定,如id INT CHARACTER SET 'utf8'
) CHARACTER SET 'utf8mb4';
SHOW CREATE TABLE temp;
3,整数类型
USE dbtest;
A,创建表
CREATE TABLE TABLE名(字段 整数类型)
CREATE TABLE test_int1(
f1 TINYINT,
f2 SMALLINT,
f3 MEDIUMINT,
f4 INTEGER,
f5 BIGINT
);
DESC test_int1;
B,存储数据
INSERT INTO test_int1(f1)
VALUES(12),(-12),(-128),(127);
SELECT * FROM test_int1;
C,可选属性M
a,M表示宽度,范围在(0,255)以内
b,配合ZEROFILL使用,否则会无效
c,mysql 8.0.17.开始不推荐使用
1,超过范围的话
INSERT INTO test_int1(f1)
VALUES(128);显示错误
2,超过INT(5)之中宽度5的限制
CREATE TABLE test_int2(
F1 INT,
F2 INT(5),只是限制宽度无意义
F3 INT(5) ZEROFILL配合ZEROFILL使用有意义
)
说明
INSERT INTO test_int2(F1,F2,F3)
VALUES(123,123),(123456,123456),();
SELECT * FROM test_int2;
3,ZEROFILL的使用
INSERT INTO test_int2(F3)
VALUES(123),(123456)使用了zerofill所以有意义
4,浮点类型——>处理小数FLOAT,DOUBLE
A,无符号取值范围只有有符号取值范围的一半
B,MYSQL允许使用非标准语法:FLOAT(M,D),DOUBLE(M,D)
M=精度=整数位+小数位 D <= M <= 255
D=标度=小数位 0 <= D <= 30
C,无论是否设置了精度(M,D)MYSQL的处理方式如下:
1,存储时,整数部分超出范围,MYSQL报错
2,存储时,小数点超出范围
a,四舍五入后没有超出范围,MYSQL警告,成功存储
b,四舍五入后超出范围,MYSQL报错
浮点数FLOAT,DOUBLE数据不准确,避免使用=
定点数DECIMAL数据准确,可以使用=
5,定点数类型DECIMAL
开发经验:除了商品编号用整数类型,其余都用DECIMAL
6,位类型BIT——>存储二进制值
1 <= M <= 64
说明
CREATE TABLE test_bit1(
F1 BIT(不规定宽度,默认为一位),
F2 BIT(5),因为是二进制所以分解为五个一,得位数为31
F3 BIT(64)
) ;
DESC test_bit1;
INSERT INTO test_bit1(F1)
VALUES (0),(1);
SELECT * FROM test_bit1
A,宽度是数字默认读取为二进制,所以
INSERT INTO test_bit1(F1)
VALUES(2);
2为十进制,系统读取为10,有两个位数,超过了F1规定的位数,显示错误
B,超出31一位
INSERT INTO test_bit1(F2)
VALUES(32);显示错误
C,通过其他进制显示
HEX()16进制——默认显示为16进制
BIN()
字段+0 十进制显示
SELECT BIN(F1),HEX(F2)
FROM test_bit1 ;
SELECT F1+0,F2+0
FROM test_bit1 ;
7,时间类型
A,YEAR
存储格式
1,4位字符串或数字(YYYY)默认
2,2位字符串(00,99)不推荐使用
(01,69)——(2001,2069)
(70,99)——(1970,1999)
(0)——(0000)
说明
CREATE TABLE test_year(
F1 YEAR,
F2 YEAR(4)
);
DESC test_year;
INSERT INTO test_year(F1)
VALUES('2021'),(2022),(69),(70);
SELECT * FROM test_year;
B,DATE
存储格式
1,YYYY-MM-DD或者YYYYMMDD
2,YY-MM-DD或者YYMMDD
(00,69)(2000,2069)
(70,99)(1970,1999)
说明
CREATE TABLE test_date(
f1 DATE
);
INSERT INTO test_date(f1)
VALUES('2020-10-01'),('20201001'),(20201001);
INSERT INTO test_date(f1)
VALUES(000301),(690301),(700301),(990301);
SELECT * FROM test_date ;
3,插入当前系统日期CURRENT_DATE()或者NOW()
INSERT INTO test_date(f1)
VALUES (CURDATE()),(CURRENT_DATE()),(NOW());
SELECT * FROM test_date ;
C,TIME
存储格式
1,
'D HH:MM:SS',字符串带D,D会被转化为小时,计算格式为D*24+HH
'HH:MM:SS',字符串不带D,表示当天时间
'12:10'——>12:10:00
2,
HHMMSS或者'HHMMSS'
1210——>00:12:10
说明
CREATE TABLE test_time(
f1 TIME
);
INSERT INTO test_time
VALUES ('2 12:30:29'),('12:35:29'),('12:40');
INSERT INTO test_time
VALUES ('123520'),(124011);
SELECT* FROM test_time;
3,插入当前系统时间CURRENT_TIME()或者NOW()
INSERT INTO test_time
VALUES (NOW()),(CURRENT_TIME());
D,DATETIME
存储格式
1,YYYY-MM-DD HH:MM:SS或者YYYYMMDDHHMMSS
2,YY-MM-DD HH:MM:SS或者YYMMDDHHMMSS
说明
CREATE TABLE test_datetime(
dt DATETIME
);
INSERT INTO test_datetime
VALUES('2020-10-01 15:07:31'),('20201001150731'),(20201001150731);
INSERT INTO test_datetime
VALUES('99-10-01 15:07:31'),('991001150731'),(991001150731);
SELECT * FROM test_datetime ;
3,插入当前系统日期和时间CURRENT_TIMESTAMP()或者NOW()
INSERT INTO test_datetime
VALUES (NOW()),(CURRENT_TIMESTAMP());
E,TIMESTAMP
1,只能储存1970-2038 UTC 年的时间
2,修改当前时区
SET TIME_ZONE = '+8:00';
数据存储时的时区,与查询数据时的时区,.有可能不同,返回结果会不同
3,TIMESTAMP和DATATIME的区别
a,TIMESTAMP存储空间小,表示范围小
b,TIMESTAMP底层存储为毫秒值
c,两个日期比大小时,TIMESTAMP更快更方便
d,DATETIME只能反映存储数据时的时区