Browse Source

'message'

machinecat520 2 years ago
parent
commit
d715de02fd
1 changed files with 486 additions and 0 deletions
  1. 486 0
      第十二章、MySQL数据类型精讲.sql

+ 486 - 0
第十二章、MySQL数据类型精讲.sql

@@ -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
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+