|
@@ -0,0 +1,486 @@
|
|
|
|
+#第十二章、MySQL数据类型精讲
|
|
|
|
+
|
|
|
|
+#1、关于属性:CHARACTER SET name
|
|
|
|
+
|
|
|
|
+SHOW VARIABLES LIKE 'CHARACTER_%';
|
|
|
|
+
|
|
|
|
+#创建数据库时指明字符集
|
|
|
|
+CREATE DATABASE IF NOT EXISTS dbtest12 CHARACTER SET 'utf8';
|
|
|
|
+
|
|
|
|
+SHOW CREATE DATABASE dbtest12;
|
|
|
|
+
|
|
|
|
+#创建表的时候,指明表的字符集
|
|
|
|
+CREATE TABLE temp(
|
|
|
|
+id INT
|
|
|
|
+) CHARACTER SET 'utf8';
|
|
|
|
+
|
|
|
|
+SHOW CREATE TABLE temp;
|
|
|
|
+
|
|
|
|
+#创建表,指明表中的字段时,可以指定字段的字符集
|
|
|
|
+CREATE TABLE temp1(
|
|
|
|
+id INT,
|
|
|
|
+NAME VARCHAR(15) CHARACTER SET 'gbk'
|
|
|
|
+);
|
|
|
|
+
|
|
|
|
+SHOW CREATE TABLE temp1;
|
|
|
|
+
|
|
|
|
+#2、整型数据类型
|
|
|
|
+USE dbtest12;
|
|
|
|
+
|
|
|
|
+CREATE TABLE test_int(
|
|
|
|
+f1 TINYINT,
|
|
|
|
+f2 SMALLINT,
|
|
|
|
+f3 MEDIUMINT,
|
|
|
|
+f4 INTEGER,
|
|
|
|
+f5 BIGINT
|
|
|
|
+);
|
|
|
|
+
|
|
|
|
+DESC test_int;
|
|
|
|
+
|
|
|
|
+INSERT INTO test_int(f1)
|
|
|
|
+VALUES(12),(-12),(-128),(127);
|
|
|
|
+
|
|
|
|
+SELECT * FROM test_int;
|
|
|
|
+
|
|
|
|
+INSERT INTO test_int(f1)
|
|
|
|
+VALUES(128);
|
|
|
|
+
|
|
|
|
+CREATE TABLE test_int2(
|
|
|
|
+f1 INT,
|
|
|
|
+f2 INT(5),
|
|
|
|
+f3 INT(5) ZEROFILL #①显示宽度为5.当insert的值不足5位时,使用0填充
|
|
|
|
+ #②当使用ZEROFILL时,自动会添加UNSIGNED
|
|
|
|
+);
|
|
|
|
+
|
|
|
|
+INSERT INTO test_int2(f1,f2)
|
|
|
|
+VALUES (123,123),(123456,123456);
|
|
|
|
+
|
|
|
|
+SELECT * FROM test_int2;
|
|
|
|
+
|
|
|
|
+INSERT INTO test_int2(f3)
|
|
|
|
+VALUES(123),(123456);
|
|
|
|
+
|
|
|
|
+SHOW CREATE TABLE test_int2;
|
|
|
|
+
|
|
|
|
+CREATE TABLE test_int3(
|
|
|
|
+f1 INT UNSIGNED
|
|
|
|
+);
|
|
|
|
+
|
|
|
|
+DESC test_int3;
|
|
|
|
+
|
|
|
|
+INSERT INTO test_int3
|
|
|
|
+VALUES(2412321);
|
|
|
|
+
|
|
|
|
+SELECT * FROM test_int3;
|
|
|
|
+
|
|
|
|
+#Out of range value for column 'f1' at row 1
|
|
|
|
+INSERT INTO test_int3
|
|
|
|
+VALUES (4294967296);
|
|
|
|
+
|
|
|
|
+#3、浮点类型
|
|
|
|
+CREATE TABLE test_double1(
|
|
|
|
+f1 FLOAT,
|
|
|
|
+f2 FLOAT(5,2),
|
|
|
|
+f3 DOUBLE,
|
|
|
|
+f4 DOUBLE(5,2)
|
|
|
|
+);
|
|
|
|
+
|
|
|
|
+DESC test_double1;
|
|
|
|
+
|
|
|
|
+INSERT INTO test_double1(f1,f2)
|
|
|
|
+VALUES(123.45,123.45);
|
|
|
|
+
|
|
|
|
+SELECT * FROM test_double1;
|
|
|
|
+
|
|
|
|
+INSERT INTO test_double1(f3,f4)
|
|
|
|
+VALUES(123.45,123.456); #存在四舍五入
|
|
|
|
+
|
|
|
|
+#Out of range value for column 'f4' at row 1
|
|
|
|
+INSERT INTO test_double1(f3,f4)
|
|
|
|
+VALUES(123.45,1234.456);
|
|
|
|
+
|
|
|
|
+#Out of range value for column 'f4' at row 1
|
|
|
|
+INSERT INTO test_double1(f3,f4)
|
|
|
|
+VALUES(123.45,999.995);
|
|
|
|
+
|
|
|
|
+#测试FLOAT和DOUBLE的精度问题
|
|
|
|
+CREATE TABLE test_double2(
|
|
|
|
+f1 DOUBLE
|
|
|
|
+);
|
|
|
|
+
|
|
|
|
+INSERT INTO test_double2
|
|
|
|
+VALUES(0.47),(0.44),(0.19);
|
|
|
|
+
|
|
|
|
+SELECT SUM(f1)
|
|
|
|
+FROM test_double2;
|
|
|
|
+
|
|
|
|
+SELECT SUM(f1) = 1.1,1.1 = 1.1
|
|
|
|
+FROM test_double2;
|
|
|
|
+
|
|
|
|
+#4、定点数类型
|
|
|
|
+CREATE TABLE test_decimal1(
|
|
|
|
+f1 DECIMAL,
|
|
|
|
+f2 DECIMAL(5,2)
|
|
|
|
+);
|
|
|
|
+
|
|
|
|
+DESC test_decimal1;
|
|
|
|
+
|
|
|
|
+INSERT INTO test_decimal1(f1)
|
|
|
|
+VALUES(123),(123.45);
|
|
|
|
+
|
|
|
|
+SELECT*FROM test_decimal1;
|
|
|
|
+
|
|
|
|
+INSERT INTO test_decimal1(f2)
|
|
|
|
+VALUES(999.99);
|
|
|
|
+
|
|
|
|
+INSERT INTO test_decimal1(f2)
|
|
|
|
+VALUES(67.567); #存在四舍五入
|
|
|
|
+
|
|
|
|
+#Out of range value for column 'f2' at row 1
|
|
|
|
+INSERT INTO test_decimal1(f2)
|
|
|
|
+VALUES(1267.567);
|
|
|
|
+
|
|
|
|
+#Out of range value for column 'f2' at row 1
|
|
|
|
+INSERT INTO test_decimal1(f2)
|
|
|
|
+VALUES(999.995);
|
|
|
|
+
|
|
|
|
+#测试定点数的精度(与DOUBLE对比)
|
|
|
|
+CREATE TABLE test_decimal2(
|
|
|
|
+f1 DECIMAL(5,2)
|
|
|
|
+);
|
|
|
|
+
|
|
|
|
+DESC test_decimal2;
|
|
|
|
+
|
|
|
|
+INSERT INTO test_decimal2
|
|
|
|
+VALUES(0.47),(0.44),(0.19);
|
|
|
|
+
|
|
|
|
+SELECT SUM(f1)
|
|
|
|
+FROM test_decimal2;
|
|
|
|
+
|
|
|
|
+SELECT SUM(f1) = 1.1,1.1 = 1.1
|
|
|
|
+FROM test_decimal2;
|
|
|
|
+
|
|
|
|
+#5、位类型:BIT
|
|
|
|
+CREATE TABLE test_bit1(
|
|
|
|
+f1 BIT,
|
|
|
|
+f2 BIT(5),
|
|
|
|
+f3 BIT(64)
|
|
|
|
+);
|
|
|
|
+
|
|
|
|
+DESC test_bit1;
|
|
|
|
+
|
|
|
|
+INSERT INTO test_bit1(f1)
|
|
|
|
+VALUES(0),(1);
|
|
|
|
+
|
|
|
|
+SELECT * FROM test_bit1;
|
|
|
|
+
|
|
|
|
+#Data too long for column 'f1' at row 1
|
|
|
|
+INSERT INTO test_bit1(f1)
|
|
|
|
+VALUES(2);
|
|
|
|
+
|
|
|
|
+INSERT INTO test_bit1(f2)
|
|
|
|
+VALUES(31);
|
|
|
|
+
|
|
|
|
+#Data too long for column 'f2' at row 1
|
|
|
|
+INSERT INTO test_bit1(f2)
|
|
|
|
+VALUES(32);
|
|
|
|
+
|
|
|
|
+SELECT BIN(f1),BIN(f2),HEX(f1),HEX(f2)
|
|
|
|
+FROM test_bit1;
|
|
|
|
+
|
|
|
|
+#此时+0以后,可以以十进制的方式显示数据
|
|
|
|
+SELECT f1 + 0,f2 + 0
|
|
|
|
+FROM test_bit1;
|
|
|
|
+
|
|
|
|
+#6、日期与时间类型
|
|
|
|
+#6.1、YEAR类型
|
|
|
|
+CREATE TABLE test_year(
|
|
|
|
+f1 YEAR,
|
|
|
|
+f2 YEAR(4)
|
|
|
|
+);
|
|
|
|
+
|
|
|
|
+DESC test_year;
|
|
|
|
+
|
|
|
|
+INSERT INTO test_year(f1)
|
|
|
|
+VALUES('2021'),(2022);
|
|
|
|
+
|
|
|
|
+SELECT * FROM test_year;
|
|
|
|
+
|
|
|
|
+INSERT INTO test_year(f1)
|
|
|
|
+VALUES('2155');
|
|
|
|
+
|
|
|
|
+#Out of range value for column 'f1' at row 1
|
|
|
|
+INSERT INTO test_year(f1)
|
|
|
|
+VALUES('2156');
|
|
|
|
+
|
|
|
|
+INSERT INTO test_year(f1)
|
|
|
|
+VALUES('69'),('70');
|
|
|
|
+
|
|
|
|
+INSERT INTO test_year(f1)
|
|
|
|
+VALUES(0),('00');
|
|
|
|
+
|
|
|
|
+#6.2、DATE类型
|
|
|
|
+CREATE TABLE test_date1(
|
|
|
|
+f1 DATE
|
|
|
|
+);
|
|
|
|
+
|
|
|
|
+DESC test_date1;
|
|
|
|
+
|
|
|
|
+INSERT INTO test_date1
|
|
|
|
+VALUES('2020-10-22'),('20201201'),(20201102);
|
|
|
|
+
|
|
|
|
+INSERT INTO test_date1
|
|
|
|
+VALUES('00-01-01'),('000101'),('69-10-01'),('691001'),('70-01-01'),('700101'),('99-01-01'),('990101');
|
|
|
|
+
|
|
|
|
+INSERT INTO test_date1
|
|
|
|
+VALUES (000301),(690301),(700301),(990301); #存在隐式转换
|
|
|
|
+
|
|
|
|
+INSERT INTO test_date1
|
|
|
|
+VALUES (CURDATE()),(CURRENT_DATE()),(NOW());
|
|
|
|
+
|
|
|
|
+SELECT * FROM test_date1;
|
|
|
|
+
|
|
|
|
+#6.3、TIME类型
|
|
|
|
+CREATE TABLE test_time1(
|
|
|
|
+f1 TIME
|
|
|
|
+);
|
|
|
|
+
|
|
|
|
+DESC test_time1;
|
|
|
|
+
|
|
|
|
+INSERT INTO test_time1
|
|
|
|
+VALUES ('2 12:30:29'),('12:35:29'),('12:40'),('2 12:40'),('1 05'),('45');
|
|
|
|
+
|
|
|
|
+INSERT INTO test_time1
|
|
|
|
+VALUES ('123520'),(124011),(1210);
|
|
|
|
+
|
|
|
|
+INSERT INTO test_time1
|
|
|
|
+VALUES (NOW()),(CURRENT_TIME()),(CURTIME());
|
|
|
|
+
|
|
|
|
+SELECT * FROM test_time1;
|
|
|
|
+
|
|
|
|
+#6.4、DATETIME类型
|
|
|
|
+CREATE TABLE test_datetime1(
|
|
|
|
+dt DATETIME
|
|
|
|
+);
|
|
|
|
+
|
|
|
|
+INSERT INTO test_datetime1
|
|
|
|
+VALUES('2021-01-01 06:50:30'),('20210101065030');
|
|
|
|
+
|
|
|
|
+INSERT INTO test_datetime1
|
|
|
|
+VALUES('99-01-01 00:00:00'),('990101000000'),('20-01-01 00:00:00'),('200101000000');
|
|
|
|
+
|
|
|
|
+INSERT INTO test_datetime1
|
|
|
|
+VALUES (CURRENT_TIMESTAMP()),(NOW()),(SYSDATE());
|
|
|
|
+
|
|
|
|
+SELECT * FROM test_datetime1;
|
|
|
|
+
|
|
|
|
+#6.5、TIMESTAMP类型
|
|
|
|
+CREATE TABLE test_timestamp1(
|
|
|
|
+ts TIMESTAMP
|
|
|
|
+);
|
|
|
|
+
|
|
|
|
+INSERT INTO test_timestamp1
|
|
|
|
+VALUES('1999-01-01 03:04:50'),('19990101030405'),('99-01-01 03:04:05'),('990101030405');
|
|
|
|
+
|
|
|
|
+INSERT INTO test_timestamp1
|
|
|
|
+VALUES('2020@01@01@00@00@00'),('20@01@01@00@00@00');
|
|
|
|
+
|
|
|
|
+INSERT INTO test_timestamp1
|
|
|
|
+VALUES(CURRENT_TIMESTAMP()),(NOW());
|
|
|
|
+
|
|
|
|
+#Incorrect datetime value: '2038-01-20 03:14:07' for column 'ts' at row 1
|
|
|
|
+INSERT INTO test_timestamp1
|
|
|
|
+VALUES('2038-01-20 03:14:07');
|
|
|
|
+
|
|
|
|
+SELECT * FROM test_timestamp1;
|
|
|
|
+
|
|
|
|
+#对比DATETIME和TIMESTAMP
|
|
|
|
+CREATE TABLE temp_time(
|
|
|
|
+d1 DATETIME,
|
|
|
|
+d2 TIMESTAMP
|
|
|
|
+);
|
|
|
|
+
|
|
|
|
+INSERT INTO temp_time
|
|
|
|
+VALUES('2021-9-2 14:45:52','2021-9-2 14:45:52');
|
|
|
|
+
|
|
|
|
+INSERT INTO temp_time
|
|
|
|
+VALUES(NOW(),NOW());
|
|
|
|
+
|
|
|
|
+SELECT * FROM temp_time;
|
|
|
|
+
|
|
|
|
+#修改当前的时区
|
|
|
|
+SET time_zone = '+9:00';
|
|
|
|
+
|
|
|
|
+SELECT * FROM temp_time;
|
|
|
|
+
|
|
|
|
+SELECT UNIX_TIMESTAMP();
|
|
|
|
+
|
|
|
|
+#7.1、CHAR类型
|
|
|
|
+CREATE TABLE test_char1(
|
|
|
|
+c1 char,
|
|
|
|
+c2 char(5)
|
|
|
|
+);
|
|
|
|
+
|
|
|
|
+DESC test_char1;
|
|
|
|
+
|
|
|
|
+INSERT INTO test_char1(c1)
|
|
|
|
+VALUES('a');
|
|
|
|
+
|
|
|
|
+SELECT * FROM test_char1;
|
|
|
|
+
|
|
|
|
+#Data too long for column 'c1' at row 1
|
|
|
|
+INSERT INTO test_char1(c1)
|
|
|
|
+VALUES('ab');
|
|
|
|
+
|
|
|
|
+INSERT INTO test_char1(c2)
|
|
|
|
+VALUES('ab');
|
|
|
|
+
|
|
|
|
+INSERT INTO test_char1(c2)
|
|
|
|
+VALUES('hello');
|
|
|
|
+
|
|
|
|
+INSERT INTO test_char1(c2)
|
|
|
|
+VALUES('你');
|
|
|
|
+
|
|
|
|
+INSERT INTO test_char1(c2)
|
|
|
|
+VALUES('你好');
|
|
|
|
+
|
|
|
|
+INSERT INTO test_char1(c2)
|
|
|
|
+VALUES('锄禾日当午');
|
|
|
|
+
|
|
|
|
+#Data too long for column 'c2' at row 1
|
|
|
|
+INSERT INTO test_char1(c2)
|
|
|
|
+VALUES('小桥流水人家');
|
|
|
|
+
|
|
|
|
+SELECT * FROM test_char1;
|
|
|
|
+
|
|
|
|
+SELECT CONCAT(c2,'***')
|
|
|
|
+FROM test_char1;
|
|
|
|
+
|
|
|
|
+INSERT INTO test_char1(c2)
|
|
|
|
+VALUES('ab ');
|
|
|
|
+
|
|
|
|
+SELECT CHAR_LENGTH(c2)
|
|
|
|
+FROM test_char1;
|
|
|
|
+
|
|
|
|
+#7.2、VARCHAR类型
|
|
|
|
+CREATE TABLE test_varchar1(
|
|
|
|
+last_name VARCHAR
|
|
|
|
+);
|
|
|
|
+
|
|
|
|
+CREATE TABLE test_varchar2(
|
|
|
|
+last_name VARCHAR(65535)
|
|
|
|
+);
|
|
|
|
+
|
|
|
|
+CREATE TABLE test_varchar3(
|
|
|
|
+`name` VARCHAR(5)
|
|
|
|
+);
|
|
|
|
+
|
|
|
|
+INSERT INTO test_varchar3
|
|
|
|
+VALUES('尚硅谷'),('尚硅谷教育');
|
|
|
|
+
|
|
|
|
+INSERT INTO test_varchar3
|
|
|
|
+VALUES('尚硅谷IT教育');
|
|
|
|
+
|
|
|
|
+SELECT * FROM test_varchar3;
|
|
|
|
+
|
|
|
|
+#7.3、TEXT类型
|
|
|
|
+CREATE TABLE test_text(
|
|
|
|
+tx TEXT
|
|
|
|
+);
|
|
|
|
+
|
|
|
|
+INSERT INTO test_text
|
|
|
|
+VALUES('atguigu ');
|
|
|
|
+
|
|
|
|
+SELECT CHAR_LENGTH(tx)
|
|
|
|
+FROM test_text;
|
|
|
|
+
|
|
|
|
+#8、ENUM类型
|
|
|
|
+CREATE TABLE test_enum(
|
|
|
|
+season ENUM('春','夏','秋','冬','unknown')
|
|
|
|
+);
|
|
|
|
+
|
|
|
|
+INSERT INTO test_enum
|
|
|
|
+VALUES('春'),('秋');
|
|
|
|
+
|
|
|
|
+SELECT * FROM test_enum;
|
|
|
|
+
|
|
|
|
+INSERT INTO test_enum
|
|
|
|
+VALUES('春','秋');
|
|
|
|
+
|
|
|
|
+INSERT INTO test_enum
|
|
|
|
+VALUES('春,秋');
|
|
|
|
+
|
|
|
|
+INSERT INTO test_enum
|
|
|
|
+VALUES('unknown');
|
|
|
|
+
|
|
|
|
+#忽略大小写的
|
|
|
|
+INSERT INTO test_enum
|
|
|
|
+VALUES('UNKNOWN');
|
|
|
|
+
|
|
|
|
+#也可以使用索引进行枚举元素的调用
|
|
|
|
+INSERT INTO test_enum
|
|
|
|
+VALUES(1),('3');
|
|
|
|
+
|
|
|
|
+#没有限制非空的情况下,可以添加null值
|
|
|
|
+INSERT INTO test_enum
|
|
|
|
+VALUES(NULL);
|
|
|
|
+
|
|
|
|
+#无法添加指定范围以外的值
|
|
|
|
+INSERT INTO test_enum
|
|
|
|
+VALUES('家');
|
|
|
|
+
|
|
|
|
+#9、SET类型
|
|
|
|
+CREATE TABLE test_set(
|
|
|
|
+s SET('A','B','C')
|
|
|
|
+);
|
|
|
|
+
|
|
|
|
+INSERT INTO test_set(s)
|
|
|
|
+VALUES ('A'),('A,B');
|
|
|
|
+
|
|
|
|
+#插入重复的SET类型成员时,MySQL会自动删除重复的成员
|
|
|
|
+INSERT INTO test_set(s)
|
|
|
|
+VALUES('A,B,C,A');
|
|
|
|
+
|
|
|
|
+#向SET类型的字段插入SET成员中不存在的值时,MySQL会抛出错误
|
|
|
|
+INSERT INTO test_set(s)
|
|
|
|
+VALUES('A,B,C,D');
|
|
|
|
+
|
|
|
|
+SELECT * FROM test_set;
|
|
|
|
+
|
|
|
|
+#举例
|
|
|
|
+CREATE TABLE temp_mul(
|
|
|
|
+gender ENUM('男','女'),
|
|
|
|
+hobby SET('吃饭','睡觉','打豆豆','写代码')
|
|
|
|
+);
|
|
|
|
+
|
|
|
|
+INSERT INTO temp_mul
|
|
|
|
+VALUES('男','睡觉,打豆豆');
|
|
|
|
+
|
|
|
|
+INSERT INTO temp_mul
|
|
|
|
+VALUES('男,女','睡觉,打豆豆');
|
|
|
|
+
|
|
|
|
+SELECT * FROM temp_mul;
|
|
|
|
+
|
|
|
|
+#64
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+
|