MySQL技术内幕-SQL编程读书笔记

# 第2章  数据类型
    1. 数据类型在数据库中扮演着基础又非常重要的角色。对数据类型的选择将影响与数据库交互的应用程序的性能。
## 2.1 类型属性
    1. 在介绍数据类型前,先来介绍两个属性:UNSIGNED和ZEROFILL,是否使用这两个属性对选择数据类型有着莫大的关系。
### 2.1.1 UNSIGNED
    1. UNSIGNED属性就是将数字类型无符号化,与C、C++这些程序语言中的UNSIGNED含义相同。
### 2.1.2 ZEROFILL
    1. ZEROFILL属性非常有意思,更像是一个显示的属性。ZEROFILL属性的作用就是如果宽度小于设定的宽度,则自动填充0。要注意的是,这只是对显示结果进行处理,对存储的值无影响。
## 2.2 SQL_MODE设置
    1. SQL_MODE可能是比较容易让开发人员和DBA忽略的一个变量,默认为空。SQL_MODE的设置其实是比较冒险的一种设置,因为在这种设置下可以允许一些非法操作。因此在生产环境中强烈建议开发人员将这个值设为严格模式。正确地设置SQL_MODE还可以做一些约束(Constraint)检查的工作。
    2. 对于SQL_MODE的设置,可以在MYSQL的配置文件如my.cnf和my.ini中进行,也可以在客户端工具中进行,并且可以分别进行全局的设置或者当前会话的设置。下面的命令可以用来查看当前SQL_MODE的设置情况。
        1. SELECT @@global.sql_mode\G (全局)
        2. SELECT @@session.sql_mode\G(当前会话)
    3. 严格模式是指将SQL_MODE变量设置为STRICT_TRANS_TABLES或STRICT_ALL_TABLES中的至少一种。现在来看下SQL_MODE可以设置的选项。
        1. STRICT_TRANS_TABLES:在该模式下,如果一个值不能插入到一个事务表中,则中断当前的操作不影响非事务表。
        2. ALLOW_INVALID_DATES:该选项并不完全对日期的合法性进行检查,只检查月份是否在1~12之间,日期是否在1~31之间。该模式仅对DATE和DATETIME类型有效,而对TIMESTAMP无效,因为TIMESTAMP总是要求一个合法的输入。
        3. ANSI_QUOTES:启用ANSI_QUOTES后,不能用双引号来引用字符串,因为它将被解释为识别符。
        4. ERROR_FOR_DIVISION_BY_ZERO:在INSERT或UPDATE过程中,如果数据被零除(或MOD(X,0)),则产生错误(否则为警告)。如果未给出该模式,那么数据被零除时MYSQL返回NULL。如果用到INSERT IGNORE或UPDATE IGNORE中,MYSQL生产被零除警告,但操作结果为NULL。
        5. HIGH_NOT_PRECEDENCE:操作符的优先顺序是表达式。
        6. IGNORE_SPACE:函数名和括号"("之间有空格。除了增加一些烦恼,这个选项好像没有任何好处,要访问保存为关键字的数据库、表或列名,用户必须引用该选项。
        7. NO_AUTO_CREATE_USER:禁止GRANT创建密码为空的用户。
        8. NO_AUTO_VALUE_NO_ZERO:该选项影响列为自增长的插入。在默认设置下,插入0或NULL代表生成下一个自增长值。如果用户希望插入的值为0,而该列又是自增长的,那么这个选项就有用了。
        9. NO_BACKSLASH_ESCAPES:反斜杠"\"作为普通字符而非转义符。
        10. NO_DIR_IN_CREATE:在创建表时忽视所有INDEX DIRECTORY和DATE DIRECTORY的选项。
        11. NO_ENGINE_SUBSTITUTION:如果需要的存储引擎被禁用或为编译,那么抛出错误。默认用默认的存储引擎替代,并抛出一个异常。
        12. NO_UNSIGNED_SUBTRACTION:启用这个选项后两个UNSIGNED类型相减返回SIGNED类型。
        13. NO_ZERO_DATE:在非严格模式下,可以插入形如"0000-00-00 00:00:00"的非法日期,MYSQL仅会抛出一个警告。而启用该选项后,MYSQL数据库不允许插入零日期,插入零日期会抛出错误而非警告。
        14. NO_ZERO_IN_DATE:在严格模式下,不允许日期和月份为零。如"2011-00-01"或"2011-01-00"这样的格式是不允许的。采用日期或月份为零的格式时MYSQL都会直接抛出错误而非警告。
        15. ONLY_FULL_GROUP_BY:对于GROUP BY聚合操作,如果在SELECT中的列没有在GROUP BY中出现,那么这句SQL是不合法的。
        16. PAD_CHAR_TO_FULL_LENGTH:对于CHAR类型字段,不要截断空洞数据。空洞数据都是自动填充为0x20的数据。
        17. PIPES_AS_CONCAT:将"||"视为空字符串的连接操作符而非或运算符,这和ORACLE数据库是一样的,也和字符串的拼接函数CONCAT()相类似。
        18. REAL_AS_FLOAT:将REAL视为FLOAT的同义词,而不是DOUBLE的同义词。
        19. STRICT_ALL_TABLES:将对所有引擎的表都启用严格模式。在严格模式下,一旦任何操作的数据产生问题,都会终止当前的操作。对于启用STRICT_ALL_TABLES选项的非事务引擎来说,这时数据可能停留在一个未知的状态。
## 2.3 日期和时间类型
    1. MYSQL数据库中有五种与日期和时间有关的数据类型,各种日期数据类型所占空间如下所示:
        1. DATETIME: 8byte
        2. DATE: 3byte
        3. TIMESTAMP: 4byte
        4. YEAR: 1byte
        5. TIME: 3byte
### 2.3.1 DATETIME和DATE
    1. DATETIME占用8字节,是占用空间最多的一种日期类型。它既显示了时间,同时也显示了时间。DATE占用3个字节,只显示了日期。
    2. MYSQL 5.6.4版本开始,MYSQL增加了对秒的小数部分(fractional second)的支持,具体语法为:type_name(fsp)
    3. 其中,type_name的类型可以是TIME、DATETIME和TIMESTAMP。fsp表示支持秒的小数部分的精度,最大为6,表示微妙(microseconds):默认为0,表示没有小数部分,同时也是为了兼容之前版本中的TIME、DATETIME和TIMESTAMP类型。对于时间类型,如CURTIME()、SYSDATE()和UTC_TIMESTAMP()也增加了fsp的支持。
### 2.3.2 TIMESTAMP
    1. TIMESTAMP和DATETIME显示的结果是一样的,都是固定的"YYYY-MM-DD HH:MM:SS"的形式。不同的是,TIMESTAMP占用4字节,显示的范围为"1970-01-01 00:00:00"UTC到"2038-01-19 03:14:07"UTC。其实际存储的内容为"1970-01-01 00:00:00"到当前时间的毫秒数。
    2. TIMESTAMP类型和DATETIME类型除了在显示时间范围上有所不同外,还有以下不同:
        1. 在建表时,列为TIMESTAMP的日期类型可以设置一个默认值,而DATETIME不行。
        2. 在更新表时,可以设置TIMESTAMP类型的列自动更新时间为当前时间。
    3. 如果执行了UPDATE操作,当时间上行并没有得到更新,那么是不会更新列的TIMESTAMP值。
### 2.3.3 YEAR和TIME
    1. YEAR类型占用了1字节,并且在定义时可以显示的宽度为YEAR(4)或YEAR(2)。
    2. TIME类型占3字节,显示的范围为"-838:59:59~838:59:59"。因为TIME类型不仅可以用来保存一天中的时间,也可以用来保存时间间隔,同时这也解释了为什么TIME类型也可以存在负值。和DATETIME类型一样,TIME类型同样可以显示微秒时间,但是在插入时,数据库同样会进行截断操作。
### 2.3.4 与日期和事件相关的函数
    1. 日期函数可能是比较常使用的一种函数。下面介绍一些最常见的日期函数及一些容易忽略的问题。
    2. NOW、CURRENT_TIMESTAMP和SYSDATE
        1. 
## 2.4 关于日期的经典SQL编程问题
## 2.5 数字类型
## 2.6 关于数字的经典SQL编程问题
## 2.7 字符类型
## 2.8 小结

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值