SQL:数据类型(Data Types)
目录
数字数据类型(Numeric data types)
非数据类型(Non-numeric data types)
日期和时间类型(Date and Time Types)
NULL(缺失或未知值)
当你在数据库中创建表格时,你必须指明表中每一列可以保存的数据类型。数据类型可以分为几类:数字数据类型(Numeric data types),非数据类型(Non-numeric data types),日期和时间类型(Date and Time Types)。
数字数据类型(Numeric data types)
1.INT
定义:整数字段,例如库存数量,自动生成的唯一主键也用INT。
范围:INT通常范围是-2,147,483,648到2,147,483,647(32位),超了会溢出。
主键:自动生成的主键(AUTO_INCREMENT)常用INT,保证每个记录有唯一ID。
使用场景:数量、ID、年龄等需要整数的地方。
2.FLOAT
定义:FLOAT(p):近似的小数,p是精度(小数点后位数)。
近似值:不像精确小数,FLOAT可能有微小误差(比如0.1 + 0.2可能不是0.3),不适合财务计算。
补充:精度p通常是1到24,超大数用DOUBLE。
使用场景:科学计算、近似价格(比如3.14美元)。
3.DECIMAL
定义:DECIMAL(M, D):精确的小数,M是总位数,D是小数点后位数。比如DECIMAL(5, 2)范围是-999.99到999.99,DECIMAL(4, 3)范围是-9.999到9.999。
精确性:不像FLOAT,DECIMAL不会出错,适合需要精确计算的场景。
设置M和D:M包括整数和小数部分,D是小数位数,选大了浪费空间,选小了存不下。
补充:DECIMAL比FLOAT慢,但精确性高,常用在银行系统。
使用场景:财务数据、精确价格。
非数据类型(Non-numeric data types)
1. CHAR
定义:CHAR(N):固定长度的字符。
通俗解释:CHAR就像一个固定大小的盒子,无论你放多少东西,盒子大小不变,多余空间会用空格填满。比如CHAR(5),如果你放“hi”(2个字符),后面会自动补3个空格变成“hi ”。
固定长度:不管你存多少,总是占用N个字符的空间。如果数据太长(超过N),会报错;太短,就浪费空间。
补充:N通常是1到255之间的数字,具体上限取决于数据库系统。
使用场景:适合长度固定的数据,比如邮政编码(比如中国邮编是6位)。
2. VARCHAR
定义:VARCHAR(N):可变长度的字符。var代表variable(可变的)。
可变长度:只占用实际数据大小的空间,外加一点额外开销(记录长度用的),比CHAR更节省空间。
最大限制:不能超过N,比如VARCHAR(5)放“helloo”会失败。
补充:VARCHAR在现代数据库中用得更多,因为它灵活且节省存储。
使用场景:适合长度不固定的数据,或者长度超过255个字符的数据。比如名字、地址。
3. ENUM
定义:ENUM(list of values):枚举类型,只能从预设列表中选择一个值,比如ENUM('xs', 's', 'm', 'l', 'xl')。
限制选择:如果输入不在列表里(比如填“xx”),会报错或默认取第一个值(取决于数据库设置)。
补充:列表里的值数量有限(通常255个以内),适合小范围选择。
使用场景:列表中的值无法改变,并且值的选择较少。比如性别(男/女)、状态(已完成/进行中)。
4. BOOLEAN
定义:真(True)或假(False)值。
存储方式:在很多数据库中,BOOLEAN实际用0和1存储(0为False,1为True)。
补充:有些数据库(如MySQL)把BOOLEAN看作TINYINT(1),但逻辑上就是真假值。
日期和时间类型(Date and Time Types)
日期和时间类型是用来存储与时间相关的数据,相当于给数据库里的“事件”贴上时间标签。
1.DATE
定义:存储日期,格式通常是YYYY-MM-DD(年-月-日),比如2023-10-15。
范围:通常从1000-01-01到9999-12-31(具体取决于数据库)。
只存日期:不能存“几点几分”,如果需要时间,得用其他类型。
格式:必须是YYYY-MM-DD,乱写(比如10-15-2023)可能会出错。
例子:CREATE TABLE users (id INT, birth_date DATE); INSERT INTO users VALUES (1, '2000-05-20');
2.DATETIME
定义:存储日期和时间,格式通常是YYYY-MM-DD HH:MM:SS(年-月-日 时:分:秒),比如2023-10-15 14:30:00。
范围:通常从1000-01-01 00:00:00到9999-12-31 23:59:59。
精度:包括秒,适合精确记录事件时间。
例子:CREATE TABLE events (id INT, event_time DATETIME); INSERT INTO events VALUES (1, '2023-10-15 14:30:00');
3.TIME
定义:只存储时间,格式是HH:MM:SS.sssss(时:分:秒),比如14:30:00。 (HH代表持续时间)
范围:通常是-838:59:59到838:59:59(支持负时间,适用于时间差)。
使用场景:事件持续时间、工作时长。
例子:CREATE TABLE schedules (id INT, duration TIME); INSERT INTO schedules VALUES (1, '02:30:00');
4.YEAR
定义:只存储年份,格式可以是YYYY(4位)或YY(2位),比如2023或23。
范围:通常是1901到2155(2位格式)或1000到9999(4位格式)。
2位转4位:输入YY时,数据库会自动补全世纪(比如70变成1970),但规则因数据库而异。
例子:CREATE TABLE cars (id INT, model_year YEAR); INSERT INTO cars VALUES (1, 2023);
NULL(缺失或未知值)
NULL是数据库中的一个特殊值,表示数据“缺失”或“未知”。理解NULL很重要,因为它跟普通值(如0或空字符串'')完全不同。
1.Missing or Unknown(缺失或未知)
定义:NULL表示某个字段的值不知道或没有定义。
不是0:0是有意义的数字,NULL是“没值”。
不是空字符串'':''是长度为0的字符串,NULL是连字符串都不是。
使用场景:未知的年龄、未填的地址。
2.Operators(操作符)
IS NULL 和 IS NOT NULL:
SELECT * FROM users WHERE phone IS NULL; 找出电话号码未知的人。
注意:不能用=或!=判断NULL,比如phone = NULL是错的,必须用IS NULL。