第十二章、MySQL数据类型精讲.sql 8.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536
  1. #第十二章、MySQL数据类型精讲
  2. #1、关于属性:CHARACTER SET name
  3. SHOW VARIABLES LIKE 'CHARACTER_%';
  4. #创建数据库时指明字符集
  5. CREATE DATABASE IF NOT EXISTS dbtest12 CHARACTER SET 'utf8';
  6. SHOW CREATE DATABASE dbtest12;
  7. #创建表的时候,指明表的字符集
  8. CREATE TABLE temp(
  9. id INT
  10. ) CHARACTER SET 'utf8';
  11. SHOW CREATE TABLE temp;
  12. #创建表,指明表中的字段时,可以指定字段的字符集
  13. CREATE TABLE temp1(
  14. id INT,
  15. NAME VARCHAR(15) CHARACTER SET 'gbk'
  16. );
  17. SHOW CREATE TABLE temp1;
  18. #2、整型数据类型
  19. USE dbtest12;
  20. CREATE TABLE test_int(
  21. f1 TINYINT,
  22. f2 SMALLINT,
  23. f3 MEDIUMINT,
  24. f4 INTEGER,
  25. f5 BIGINT
  26. );
  27. DESC test_int;
  28. INSERT INTO test_int(f1)
  29. VALUES(12),(-12),(-128),(127);
  30. SELECT * FROM test_int;
  31. INSERT INTO test_int(f1)
  32. VALUES(128);
  33. CREATE TABLE test_int2(
  34. f1 INT,
  35. f2 INT(5),
  36. f3 INT(5) ZEROFILL #①显示宽度为5.当insert的值不足5位时,使用0填充
  37. #②当使用ZEROFILL时,自动会添加UNSIGNED
  38. );
  39. INSERT INTO test_int2(f1,f2)
  40. VALUES (123,123),(123456,123456);
  41. SELECT * FROM test_int2;
  42. INSERT INTO test_int2(f3)
  43. VALUES(123),(123456);
  44. SHOW CREATE TABLE test_int2;
  45. CREATE TABLE test_int3(
  46. f1 INT UNSIGNED
  47. );
  48. DESC test_int3;
  49. INSERT INTO test_int3
  50. VALUES(2412321);
  51. SELECT * FROM test_int3;
  52. #Out of range value for column 'f1' at row 1
  53. INSERT INTO test_int3
  54. VALUES (4294967296);
  55. #3、浮点类型
  56. CREATE TABLE test_double1(
  57. f1 FLOAT,
  58. f2 FLOAT(5,2),
  59. f3 DOUBLE,
  60. f4 DOUBLE(5,2)
  61. );
  62. DESC test_double1;
  63. INSERT INTO test_double1(f1,f2)
  64. VALUES(123.45,123.45);
  65. SELECT * FROM test_double1;
  66. INSERT INTO test_double1(f3,f4)
  67. VALUES(123.45,123.456); #存在四舍五入
  68. #Out of range value for column 'f4' at row 1
  69. INSERT INTO test_double1(f3,f4)
  70. VALUES(123.45,1234.456);
  71. #Out of range value for column 'f4' at row 1
  72. INSERT INTO test_double1(f3,f4)
  73. VALUES(123.45,999.995);
  74. #测试FLOAT和DOUBLE的精度问题
  75. CREATE TABLE test_double2(
  76. f1 DOUBLE
  77. );
  78. INSERT INTO test_double2
  79. VALUES(0.47),(0.44),(0.19);
  80. SELECT SUM(f1)
  81. FROM test_double2;
  82. SELECT SUM(f1) = 1.1,1.1 = 1.1
  83. FROM test_double2;
  84. #4、定点数类型
  85. CREATE TABLE test_decimal1(
  86. f1 DECIMAL,
  87. f2 DECIMAL(5,2)
  88. );
  89. DESC test_decimal1;
  90. INSERT INTO test_decimal1(f1)
  91. VALUES(123),(123.45);
  92. SELECT*FROM test_decimal1;
  93. INSERT INTO test_decimal1(f2)
  94. VALUES(999.99);
  95. INSERT INTO test_decimal1(f2)
  96. VALUES(67.567); #存在四舍五入
  97. #Out of range value for column 'f2' at row 1
  98. INSERT INTO test_decimal1(f2)
  99. VALUES(1267.567);
  100. #Out of range value for column 'f2' at row 1
  101. INSERT INTO test_decimal1(f2)
  102. VALUES(999.995);
  103. #测试定点数的精度(与DOUBLE对比)
  104. CREATE TABLE test_decimal2(
  105. f1 DECIMAL(5,2)
  106. );
  107. DESC test_decimal2;
  108. INSERT INTO test_decimal2
  109. VALUES(0.47),(0.44),(0.19);
  110. SELECT SUM(f1)
  111. FROM test_decimal2;
  112. SELECT SUM(f1) = 1.1,1.1 = 1.1
  113. FROM test_decimal2;
  114. #5、位类型:BIT
  115. CREATE TABLE test_bit1(
  116. f1 BIT,
  117. f2 BIT(5),
  118. f3 BIT(64)
  119. );
  120. DESC test_bit1;
  121. INSERT INTO test_bit1(f1)
  122. VALUES(0),(1);
  123. SELECT * FROM test_bit1;
  124. #Data too long for column 'f1' at row 1
  125. INSERT INTO test_bit1(f1)
  126. VALUES(2);
  127. INSERT INTO test_bit1(f2)
  128. VALUES(31);
  129. #Data too long for column 'f2' at row 1
  130. INSERT INTO test_bit1(f2)
  131. VALUES(32);
  132. SELECT BIN(f1),BIN(f2),HEX(f1),HEX(f2)
  133. FROM test_bit1;
  134. #此时+0以后,可以以十进制的方式显示数据
  135. SELECT f1 + 0,f2 + 0
  136. FROM test_bit1;
  137. #6、日期与时间类型
  138. #6.1、YEAR类型
  139. CREATE TABLE test_year(
  140. f1 YEAR,
  141. f2 YEAR(4)
  142. );
  143. DESC test_year;
  144. INSERT INTO test_year(f1)
  145. VALUES('2021'),(2022);
  146. SELECT * FROM test_year;
  147. INSERT INTO test_year(f1)
  148. VALUES('2155');
  149. #Out of range value for column 'f1' at row 1
  150. INSERT INTO test_year(f1)
  151. VALUES('2156');
  152. INSERT INTO test_year(f1)
  153. VALUES('69'),('70');
  154. INSERT INTO test_year(f1)
  155. VALUES(0),('00');
  156. #6.2、DATE类型
  157. CREATE TABLE test_date1(
  158. f1 DATE
  159. );
  160. DESC test_date1;
  161. INSERT INTO test_date1
  162. VALUES('2020-10-22'),('20201201'),(20201102);
  163. INSERT INTO test_date1
  164. VALUES('00-01-01'),('000101'),('69-10-01'),('691001'),('70-01-01'),('700101'),('99-01-01'),('990101');
  165. INSERT INTO test_date1
  166. VALUES (000301),(690301),(700301),(990301); #存在隐式转换
  167. INSERT INTO test_date1
  168. VALUES (CURDATE()),(CURRENT_DATE()),(NOW());
  169. SELECT * FROM test_date1;
  170. #6.3、TIME类型
  171. CREATE TABLE test_time1(
  172. f1 TIME
  173. );
  174. DESC test_time1;
  175. INSERT INTO test_time1
  176. VALUES ('2 12:30:29'),('12:35:29'),('12:40'),('2 12:40'),('1 05'),('45');
  177. INSERT INTO test_time1
  178. VALUES ('123520'),(124011),(1210);
  179. INSERT INTO test_time1
  180. VALUES (NOW()),(CURRENT_TIME()),(CURTIME());
  181. SELECT * FROM test_time1;
  182. #6.4、DATETIME类型
  183. CREATE TABLE test_datetime1(
  184. dt DATETIME
  185. );
  186. INSERT INTO test_datetime1
  187. VALUES('2021-01-01 06:50:30'),('20210101065030');
  188. INSERT INTO test_datetime1
  189. VALUES('99-01-01 00:00:00'),('990101000000'),('20-01-01 00:00:00'),('200101000000');
  190. INSERT INTO test_datetime1
  191. VALUES (CURRENT_TIMESTAMP()),(NOW()),(SYSDATE());
  192. SELECT * FROM test_datetime1;
  193. #6.5、TIMESTAMP类型
  194. CREATE TABLE test_timestamp1(
  195. ts TIMESTAMP
  196. );
  197. INSERT INTO test_timestamp1
  198. VALUES('1999-01-01 03:04:50'),('19990101030405'),('99-01-01 03:04:05'),('990101030405');
  199. INSERT INTO test_timestamp1
  200. VALUES('2020@01@01@00@00@00'),('20@01@01@00@00@00');
  201. INSERT INTO test_timestamp1
  202. VALUES(CURRENT_TIMESTAMP()),(NOW());
  203. #Incorrect datetime value: '2038-01-20 03:14:07' for column 'ts' at row 1
  204. INSERT INTO test_timestamp1
  205. VALUES('2038-01-20 03:14:07');
  206. SELECT * FROM test_timestamp1;
  207. #对比DATETIME和TIMESTAMP
  208. CREATE TABLE temp_time(
  209. d1 DATETIME,
  210. d2 TIMESTAMP
  211. );
  212. INSERT INTO temp_time
  213. VALUES('2021-9-2 14:45:52','2021-9-2 14:45:52');
  214. INSERT INTO temp_time
  215. VALUES(NOW(),NOW());
  216. SELECT * FROM temp_time;
  217. #修改当前的时区
  218. SET time_zone = '+9:00';
  219. SELECT * FROM temp_time;
  220. SELECT UNIX_TIMESTAMP();
  221. #7.1、CHAR类型
  222. CREATE TABLE test_char1(
  223. c1 char,
  224. c2 char(5)
  225. );
  226. DESC test_char1;
  227. INSERT INTO test_char1(c1)
  228. VALUES('a');
  229. SELECT * FROM test_char1;
  230. #Data too long for column 'c1' at row 1
  231. INSERT INTO test_char1(c1)
  232. VALUES('ab');
  233. INSERT INTO test_char1(c2)
  234. VALUES('ab');
  235. INSERT INTO test_char1(c2)
  236. VALUES('hello');
  237. INSERT INTO test_char1(c2)
  238. VALUES('你');
  239. INSERT INTO test_char1(c2)
  240. VALUES('你好');
  241. INSERT INTO test_char1(c2)
  242. VALUES('锄禾日当午');
  243. #Data too long for column 'c2' at row 1
  244. INSERT INTO test_char1(c2)
  245. VALUES('小桥流水人家');
  246. SELECT * FROM test_char1;
  247. SELECT CONCAT(c2,'***')
  248. FROM test_char1;
  249. INSERT INTO test_char1(c2)
  250. VALUES('ab ');
  251. SELECT CHAR_LENGTH(c2)
  252. FROM test_char1;
  253. #7.2、VARCHAR类型
  254. CREATE TABLE test_varchar1(
  255. last_name VARCHAR
  256. );
  257. CREATE TABLE test_varchar2(
  258. last_name VARCHAR(65535)
  259. );
  260. CREATE TABLE test_varchar3(
  261. `name` VARCHAR(5)
  262. );
  263. INSERT INTO test_varchar3
  264. VALUES('尚硅谷'),('尚硅谷教育');
  265. INSERT INTO test_varchar3
  266. VALUES('尚硅谷IT教育');
  267. SELECT * FROM test_varchar3;
  268. #7.3、TEXT类型
  269. CREATE TABLE test_text(
  270. tx TEXT
  271. );
  272. INSERT INTO test_text
  273. VALUES('atguigu ');
  274. SELECT CHAR_LENGTH(tx)
  275. FROM test_text;
  276. #8、ENUM类型
  277. CREATE TABLE test_enum(
  278. season ENUM('春','夏','秋','冬','unknown')
  279. );
  280. INSERT INTO test_enum
  281. VALUES('春'),('秋');
  282. SELECT * FROM test_enum;
  283. INSERT INTO test_enum
  284. VALUES('春','秋');
  285. INSERT INTO test_enum
  286. VALUES('春,秋');
  287. INSERT INTO test_enum
  288. VALUES('unknown');
  289. #忽略大小写的
  290. INSERT INTO test_enum
  291. VALUES('UNKNOWN');
  292. #也可以使用索引进行枚举元素的调用
  293. INSERT INTO test_enum
  294. VALUES(1),('3');
  295. #没有限制非空的情况下,可以添加null值
  296. INSERT INTO test_enum
  297. VALUES(NULL);
  298. #无法添加指定范围以外的值
  299. INSERT INTO test_enum
  300. VALUES('家');
  301. #9、SET类型
  302. CREATE TABLE test_set(
  303. s SET('A','B','C')
  304. );
  305. INSERT INTO test_set(s)
  306. VALUES ('A'),('A,B');
  307. #插入重复的SET类型成员时,MySQL会自动删除重复的成员
  308. INSERT INTO test_set(s)
  309. VALUES('A,B,C,A');
  310. #向SET类型的字段插入SET成员中不存在的值时,MySQL会抛出错误
  311. INSERT INTO test_set(s)
  312. VALUES('A,B,C,D');
  313. SELECT * FROM test_set;
  314. #举例
  315. CREATE TABLE temp_mul(
  316. gender ENUM('男','女'),
  317. hobby SET('吃饭','睡觉','打豆豆','写代码')
  318. );
  319. INSERT INTO temp_mul
  320. VALUES('男','睡觉,打豆豆');
  321. INSERT INTO temp_mul
  322. VALUES('男,女','睡觉,打豆豆');
  323. SELECT * FROM temp_mul;
  324. #10.1、BINARY 与 VARBINARY类型
  325. CREATE TABLE test_binary1(
  326. f1 BINARY,
  327. f2 BINARY(3),
  328. #f3 VARBINARY,
  329. f4 VARBINARY(10)
  330. );
  331. DESC test_binary1;
  332. INSERT INTO test_binary1(f1,f2)
  333. VALUES('a','abc');
  334. SELECT * FROM test_binary1;
  335. #Data too long for column 'f1' at row 1
  336. INSERT INTO test_binary1(f1)
  337. VALUES('ab');
  338. INSERT INTO test_binary1(f2,f4)
  339. VALUES('ab','ab');
  340. SELECT * FROM test_binary1;
  341. SELECT LENGTH(f2),LENGTH(f4)
  342. FROM test_binary1;
  343. #10.2、BLOB类型
  344. CREATE TABLE test_blob1(
  345. id INT,
  346. img MEDIUMBLOB
  347. );
  348. INSERT INTO test_blob1(id)
  349. VALUES(1001);
  350. SELECT * FROM test_blob1;
  351. #11、JSON类型
  352. CREATE TABLE test_json(
  353. js JSON
  354. );
  355. INSERT INTO test_json(js)
  356. VALUES('{"name":"songhk","age":18,"address":{"province":"beijing","city":"beijing"}}');
  357. SELECT * FROM test_json;
  358. SELECT js -> '$.name' AS name , js -> '$.age' AS age , js -> '$.address.province' AS province , js -> '$.address.city' AS city
  359. FROM test_json;