123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536 |
- #第十二章、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;
- #10.1、BINARY 与 VARBINARY类型
- CREATE TABLE test_binary1(
- f1 BINARY,
- f2 BINARY(3),
- #f3 VARBINARY,
- f4 VARBINARY(10)
- );
- DESC test_binary1;
- INSERT INTO test_binary1(f1,f2)
- VALUES('a','abc');
- SELECT * FROM test_binary1;
- #Data too long for column 'f1' at row 1
- INSERT INTO test_binary1(f1)
- VALUES('ab');
- INSERT INTO test_binary1(f2,f4)
- VALUES('ab','ab');
- SELECT * FROM test_binary1;
- SELECT LENGTH(f2),LENGTH(f4)
- FROM test_binary1;
- #10.2、BLOB类型
- CREATE TABLE test_blob1(
- id INT,
- img MEDIUMBLOB
- );
- INSERT INTO test_blob1(id)
- VALUES(1001);
- SELECT * FROM test_blob1;
- #11、JSON类型
- CREATE TABLE test_json(
- js JSON
- );
- INSERT INTO test_json(js)
- VALUES('{"name":"songhk","age":18,"address":{"province":"beijing","city":"beijing"}}');
- SELECT * FROM test_json;
- SELECT js -> '$.name' AS name , js -> '$.age' AS age , js -> '$.address.province' AS province , js -> '$.address.city' AS city
- FROM test_json;
|