Java学习者论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

恭喜Java学习者论坛(https://www.javaxxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,购买链接:点击进入购买VIP会员
JAVA高级面试进阶视频教程Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程

Go语言视频零基础入门到精通

Java架构师3期(课件+源码)

Java开发全终端实战租房项目视频教程

SpringBoot2.X入门到高级使用教程

大数据培训第六期全套视频教程

深度学习(CNN RNN GAN)算法原理

Java亿级流量电商系统视频教程

互联网架构师视频教程

年薪50万Spark2.0从入门到精通

年薪50万!人工智能学习路线教程

年薪50万!大数据从入门到精通学习路线年薪50万!机器学习入门到精通视频教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程 MySQL入门到精通教程
查看: 233|回复: 0

[默认分类] Mysql使用规范-----建表

[复制链接]
  • TA的每日心情
    开心
    2021-12-13 21:45
  • 签到天数: 15 天

    [LV.4]偶尔看看III

    发表于 2018-7-6 10:43:20 | 显示全部楼层 |阅读模式

    一、 MySQL建表,字段需设置为非空,需设置字段默认值。
             原因是没启用MySQL的严格模式(strict mode),很多快捷开发环境自带的MySQL(PHPnow WAMP Appserv等),都没有启用严格模式,甚至是在一些产品环境(production environment)都忽略了这点。
    非严格模式下,MySQL会容忍许多开发上的疏忽,例如把一个长度100的字符串插入到varcaht中只会截断多余的部分而不报错。严格模式对数据的格式、长度、类型等进行校验,你贴出的建表语句中指定了DEFAULT,如果此时不指定DEFAULT,在你认为会启用默认值的时候会返回#1364错误。
    开发阶段最好启用严格模式,这是对我们代码严谨性的测试,严进宽出也能保证转移到产品环境和后续的数据库迁移、重构顺利。为什么数据库要设置默认值呢?因为我们希望在插入数据时,有意或无意间被忽略的字段能够交由MySQL按你事先预想的方式处理,例如一些默认正常状态码、用户插入数据时候尚未设置的文本字段,诸如此类。
    我的习惯是任何数据表的任何列都是非空(NOT NULL),在此基础上将数字默认设为0,文本默认设为""(在PHPMyAdmin中留空)。这里涉及一个NULL和""的区别,对此我所知尚少,我使用""的原因是根据语义NULL表示“此字段值为空”,而""表示“此字段暂未设置值”。另一个原因是在MyISAM引擎下,NULL对索引、索引统计、磁盘占用都会有额外的开销,一个允许为NULL的列,每个字段的长度都比NOT NULL的多1bit,我不确定最近几年是否有所改善,涉及到NULL的资料大概是在MySQL5.0时看过的。从应用层php角度来看,可以减少程序判断代码,比如你要插入一条记录,如果没默认值,你是不是得先判断该字段对应变量是否被设置,如果没有,你得通过php把该变量置为""或者0,否则这条insert语句会报异常,如果设了默认值,该部判断可直接略过

    二、 MySQL建表,字段需NULL时,需设置字段默认值,默认值不为NULL。

            为什么mysql字段要设置为not null?

            首先 我们创建一个表 user字段为允许null,age字段为允许null    都无默认值 age设定默认值Empty String


    1. DROP TABLE IF EXISTS `test`;
    2. CREATE TABLE `test` (
    3.   `id` int(10) unsigned NOT NULL auto_increment,
    4.   `user` varchar(45) default NULL,
    5.   `age` varchar(45) default "",
    6.   PRIMARY KEY  (`id`)
    7. ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
    复制代码
           然后导入2条数据
    1. INSERT INTO `test`(age) VALUES ("10");INSERT INTO `test`(user) VALUES ("zhangsan");
    复制代码
    然后仔细观察


    可以看到 给了默认值的age默认为  而uesr没给默认值则为Null
    下边我们来执行查询
    首先查询用户为空的
    然后查询年龄为空的

    为什么user我空查不到 而age同样为空确能查到呢?
    如果你使用的是java等强类型语言那么你很容易理解 ,而使用php等若类型语言就需要注意了

    请注意 MYSQL不是PHP,NULL不等于空字符串 更不会做类型转换!
    而我们使用做WEB开发的时候,有的地方插入记录 是指定空字符串,有的地方插入记录没有指定值,如果字段设置默认值,那么查询的时候只需要 select * from test where user =‘’即可 所以MySQL建表,字段需NULL时,需设置字段默认值,默认值不为NULL。 默认为0同理



    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|Java学习者论坛 ( 声明:本站资料整理自互联网,用于Java学习者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2025-2-24 04:53 , Processed in 0.389230 second(s), 48 queries .

    Powered by Discuz! X3.4

    © 2001-2017 Comsenz Inc.

    快速回复 返回顶部 返回列表