字面量就是字面的含义,主要是在insert操作
整型字面量.浮点数字面量,字符串字面量,日期字面量,时间字面量,时间日期字面量
如果每种字面量的值设置不合理,会导致插入失败或者隐式类型转换。
字面量literal:就是一个不变的、固定的值。字面量总是有一个数据类型
整型字面量:不带小数点的整数。如12 -50 +80
小数字面量:带或者不带小数点的数值。如:49 18.47 -0.47 +5.38
**浮点字面量:**就是小数字面量后面跟着一个指数。如:-34e2 0.16e4 4e-3
字符串字面量:使用双引号或者单引号括起来的字母或数字的组合。引号定义了字符串的开头和结尾,它们本身不是字面量的一部分。字符串字面量中也可以包含引号。为了在字面量中表示一个单引号,需要使用双引号。”don’t” 或者 ‘don’’t’
日期字面量:由年月日3个部分组成。MySQL允许该字面量写作一个字符串字面量或者整型字面量。字符串的写法:整个值用单引号括起来,3个部分使用短横线(推荐使用)或者/、@、 %来隔开。不相关的0可以在后面两个部分中省略。例如:’1980-12-08’ ‘1991@6@19’ ‘1991-6-19’ 。整数的写法:3个部分相互连接的编写,没有短横线等连字符。Mysql把最后两个数字解释为日期部分,最后两个数字之前的两个数字解释为月份部分,再前面的所有部分解释为年份。例如:19801208 19910619 991111
强烈建议使用日期字面量时,采用字符串的写法,并且年部分写4位数字
设置@@sql_mode中包含“ansi_quotes”,使得日期字面量和时间字面量只能使用单引号括起来
日期字面量的取值范围为1000年1月1日到9999年12月31日,并且应该代表着一个实际存在的日期。有两个例外情况:1)日期‘0000-00-00’是允许的,叫做零日期(zero date)。它可以用来表示某个还不知道的日期。2)日期有一个合法的年份但是月或日部分为0的日期也是允许的,也叫做零日期。例如:‘2006-00-00’或者’2006-11-00’。
例16:为一个表添加一个不正确的日期并显示结果
create table incorrect_dates(column1 date);
SELECT @@sql_mode;
STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION
insert into incorrect_dates values(‘0000-00-00’);
insert into incorrect_dates values(‘2012-00-12’);
insert into incorrect_dates values(‘2012-05-00’);
select column1 from incorrect_values;
SET@@sql_mode=‘STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION,NO_ZERO_DATE,NO_ZERO_IN_DATE’;
insert into incorrect_dates values(‘0000-00-00’);
错误代码: 1292
Incorrect date value: ‘0000-00-00’ for column ‘column1’ at row 1
insert into incorrect_dates values(‘2012-00-12’);
错误代码: 1292
Incorrect date value: ‘2012-00-12’ for column ‘column1’ at row 1
insert into incorrect_dates values(‘2012-05-00’);
错误代码: 1292
Incorrect date value: ‘2012-05-00’ for column ‘column1’ at row 1
INSERT INTO incorrect_dates VALUES(‘10-10-2012’);
错误代码: 1292
Incorrect date value: ‘10-10-2012’ for column ‘column1’ at row 1
时间字面量:包含时分秒和小数秒4个部分。MySQL允许该字面量写作一个字符串字面量或者整型字面量
字符串的写法:整个值用引号括起来,并且前3个部分必须用冒号或者/、@、 %来隔开。小数秒前面有一个点。当只指定两个部分时,mysql把它看做小时和分钟。当只指定1个部分时,mysql把它看做秒。例如:‘23:59:59’ ’12:10:00’ ’14:00’ ‘14’ 14秒,等价于‘00:00:14’
整数的写法:前3个部分相互连接的编写,没有短横线等连字符。MySQL把最后两个数字解释为秒部分,最后两个数字之前的两个数字解释为分钟部分,再前面的所有部分解释为小时。例如:235959 午夜前的1秒 1400 午夜后的14分钟
强烈建议使用日期字面量时,采用字符串的写法,并且冒号作为分隔符
当使用INSERT语句插入一个带小数秒的时间值时,小数秒部分被删除(小数秒部分以5开头时,会四舍五入)。例17:
create table time_table(column1 time);
insert into time_table values(’23:59:59.5912’);
select * from time_table;
时间字面量还可以保存时间间隔值。可以在小时前指定几天。例如:’10 10:00:00’ 或者 ’10 10’ —表示10天零10个小时。例18:
INSERT INTO time_table VALUES(‘10 10:00:00’);
select * from time_table;
日期时间字面量和时间戳字面量:
都由7部分组成:年月日时分秒和小数秒。都可以写作一个字符串字面量或者整型字面量
字符串写法:年月日部分使用短横线连接,时分秒部分使用冒号隔开。日期和时间之间有一个空格,小数秒前面有一个小数点。小数秒可以有6位。例如:
‘1980-12-08 23:59:59.999999 ’ ‘1991-6-19 12:5:00’
当使用INSERT语句插入一个带小数秒的日期时间字面量或时间戳字面量时,小数秒部分被删除(小数秒部分以5开头时,会四舍五入)。例19:
CREATE TABLE timestamp_table(column1 TIMESTAMP);
INSERT INTO timestamp_table VALUES(‘2000-12-08 23:59:59.59’);
SELECT * FROM timestamp_table;
MySQL 5.7对time、datetime、timestamp值提供了存储小数秒的支持。要想列可以存储小数秒,定义列时必须指定小数秒的精度。语法:type_name(精度) 。其中,type_name是 TIME, DATETIME, or TIMESTAMP,精度0—6。如果省略精度,默认为0。(和标准SQL中的默认为6不同)
当插入一个带小数秒的TIME、DATE、TIMESTAMP值时,如果小数秒部分超过了列的小数秒的精度,那么会自动四舍五入。例20:
CREATE TABLE fractest(c1 time(2), c2 DATETIME(2), c3 timestamp(2) );
INSERT INTO fractest VALUES
(‘17:51:04.777’, ‘2014-09-08 17:51:04.777’, ‘2014-09-08 17:51:04.777’);
SELECT * FROM fractest;
日期时间字面量和时间戳字面量的区别:
年部分的取值范围:前者年的部分是1000—9999,后者年的部分是1970—2037
时间戳字面量在存取时会自动根据时区进行转换:在保存到表中时,自动按UTC(0时区)做转换;当从表中查询时,自动按客户端会话的时区做转换
例21:保存和检索时间戳值
–-查看当前客户端的时区设置:
SELECT @@time_zone;
CREATE TABLE tz(col1 TIMESTAMP);
INSERT INTO tz VALUES(‘2005-01-01 12:00:00’);
SELECT * FROM tz;
—将客户端的时区修改为东10区(澳大利亚悉尼):
SET time_zone=’+10:00’;
SELECT @@time_zone;
SELECT * FROM tz;
MySQL服务器时区支持
系统时区
当服务器启动时,便试图确定主机的时区,并用它来设置system_time_zone系统变量。该值此后不再改变。系统时区也可以在使用命令行启动服务器时进行设置。(对mysqld_safe,使用–timezone=timezone_name。对mysqld,使用tz环境变量)
服务器的当前时区
全局系统变量time_zone表示服务器当前使用的时区。初使值为‘SYSTEM’,表示服务器的当前时区与系统时区相同。在命令行可以用–default-time-zone=timezone选项显式指定初始值。如果你有SUPER 权限,可以用下面的语句在运行时设置全局变量值:
mysql> SET GLOBAL time_zone = timezone;
每个连接的时区
每个客户端连接有自己的时区设置,用会话time_zone变量给出。其初始值与全局变量time_zone相同(可见,默认情况下,客户端和服务器的时区相同),但客户端可以用下面的语句进行修改:
mysql> SET time_zone = timezone;
可以用下面的方法查询当前的服务器和每个客户端连接的时区:
mysql> SELECT @@global.time_zone, @@session.time_zone;
timezone值为字符串,表示相对UTC的偏移量,例如‘+10:00’或‘-6:00’。如果已经创建并装入mysql数据库中的时区相关表,你还可以使用命名的时区,例如:‘US/Eastern’
布尔字面量:它有两个值:true(1)和false(0)
例22 :得到字面量true和false的数字值
select true, false
16进制字面量
例如:x’41’ X’3b’
位字面量:
例如:b’1011’
间隔字面量
一个时间间隔表示一段时间,使用day,week,month,quarter,year的数量来表示,或者是这5个值的组合
示例:
INTERVAL 10 DAY 10天
INTERVAL 100 WEEK 100周
INTERVAL 1 MONTH 1个月
INTERVAL 3 YEAR 3年
当在select子句中出现字面量时,对查询返回的每一行,字面量会原样输出一次
例23:
SELECT last_name||’ is a’ ||job_id
FROM employees;