(1)数据类型: 1)数据类型 1.1 数据类型分类 a) 数值类型 — TINYINT、SMALLINT、MEDIUMINT、INT、BIGINT、 DECIMAL b) 时间类型 — DATE、DATETIME、TIMESTAMP c) 字符串类型 — CHAR、VARCHAR、TEXT d) 特有类型 — ENUM、SET 1.2 特别说明 Ø VARCHAR(N) 或 CHAR(N)中 N 的含义 MySQL 中两类字符串 VARCHAR(N) 或 CHAR(N)定义时候填写的长度 N,不是字节数的意思 ,而是字符数的含义。 Ø 浮点数 同财务有关的浮点数必须使用存储的 DECIMAL 数值类型。为减少浮点类型 FLOAT 和DOUBLE 的精度不够而可能造成数值计算存在偏差,故非财务相关的浮点数字段也采用DECIMAL 数值类型存储,禁止使用 FLOAL 和 DOUBLE 类型。例如:weight DECIMAL(10,4) NOT NULL DEFAULT 0。 1.3 1.4 详细说明 1.类似于状态,且有限类别的字段,推荐使用可比较明显表示出实际意义的字符串,而不应该使用 INT 之类的数字来代替,故推荐使用枚举类型 ENUM 和集合类型 SET; 2.使用 UTF8 时,因其是变长的字符集,故固定和动态长度的字符串都应用 VARCHAR; 3.仅仅当字符数量可能超过 20000 个的时候,可以使用 TEXT/MEDIUMTEXT 类型来存放字符类数据。推荐所有使用 TEXT/MEDIUMTEXT 类型的字段和原表进行分拆,与原表主键单独组成另外一个表进行存放; 需要时间(年月日时分秒)的字段可以使用 DATETIME 或 TIMESTAMP,但请注意各自能表达的范围,以及是否需要用到 TIMESTAMP 的特性,尽量使用 TIMESTAMP类型替代 DATETIME 以减少数据存储空间的占用;需要毫秒、微妙时,使用TIMESTAMP (3)或 TIMESTAMP (6),以及 DATETIME(3)和 DATETIME(6)(注:社区版 5.6 开始 DATATIME 也支持 CURRENT_TIMESTAMP.,且支持任意数量与组合); 4.所有只需要到天的字段全部使用 DATE 类型,而不应该使用 TIMESTAMP 或者DATETIME 类型; 5.自增序列特性的字段只能使用 INT 或者 BIGINT,强烈推荐明确标识为无符号类型(关键词:UNSIGNED),除非确实会出现负数,仅当该字段的数值会超过 42 亿,才使用 BIGINT 类型,并且自增字段必须作为主键或主键的一部分; 6.INT(N)中 N 的含义 7.MySQL 中各类整形也可包含长度,该长度的含义和 Oracle 的 NUMBER 类型的长度含义不同,N 值的大小完全不影响数值的存储范围,只影响有 ZEROFILL 时显示的长度。 空字符串的含义 8.MySQL 中字符串存在三种容易混淆的值:空字符串’’、空值 NULL 和 NULL 字符串’NULL’,需要注意判断。和 Oracle 的大区别为 Oracle 不区分空字符串’’和空值 NULL。 1.1.5 分片字段数据类型选择 禁止选择大字段类型,以及非浮点型,空间类型的字段作为分片字段的数据类型。 禁止作为分片字段的类型见下列表格: 避免分片字段使用二进制类型 binary 和 varbinay。 避免分片字段使用二进制校对规则。可在 MySQL 数据库执行 SQL 语句,查找二进制的校对规则:select * from information_schema.collations where collation_
分享超实用的MySQL左连接的知识点 【现象】 Ecbil项目中使用左联接的SQL语句,几乎全部存在如图不当写法:(因为放置问题,图片位于文章末尾) 为便于更多的技友快速读懂、理解,只讨论2张表对象进行连接操作的情况,大于2张表对象进行的连接操作原理也是一样的。 【语法】 SELECT M.columnname……,N.* columnname…… FROM left_table M LEFT JOIN right_table N ON M. columnname_join=N. columnname_join AND N. columnname=XXX WHERE M.columnname=XXX…… 【特性】 ON字句连接条件,用于把2表中等值的记录连接在一起,但是不影响记录集的数量。若是left_table中的某记录,无法在表right_table找到对应的记录,则此记录依然显示在记录集钟,只表 right_table需要在查询显示的列的值用NULL替代; ON字句连接条件中表right_table. columnname=XXX用于控制right_table表是否有符合要求的列值还是用NULL替换的方式显示在查询列中,不影响记录集的数量; WHERE字句控制记录是否符合查询要求,不符合则过滤掉; 【总结】 ON字句控制right_table的列值符合显示,还是不符合就用NULL替换,不影响终符合查询要求的记录集;WHERE字句是控制那些记录是显示在终的记录集中。 【常见错误用法的左连接】 错把限制表right_table的条件,从ON 子句中放到WHERE字句中的SQL及数据(编号:SQL_8) root@localhost : eugene 03:49:57> SELECT M.ID,M.username,N.CollectNum,N.BuyNum -> FROM left_table M LEFT JOIN right_table N ON M.ID=N.UID -> WHERE M.ID<=6 AND N.SearchNum>300; ±—±----------------±-----------±-------+ | ID | username | CollectNum | BuyNum | ±—±----------------±-----------±-------+ | 1 | 06440350@qq.com | 817 | 39 | ±—±----------------±-----------±-------+ 错把限制表left_table或称影响终记录集的条件,从WHERE子句中放到ON字句中的SQL及数据(编号:SQL_9) root@localhost : eugene 03:54:14> SELECT M.ID,M.username,N.CollectNum,N.BuyNum -> FROM left_table M LEFT JOIN right_table N ON M.ID=N.UID AND M.ID<=6 AND N.SearchNum>300; ±—±----------------±-----------±-------+ | ID | username | CollectNum | BuyNum | ±—±----------------±-----------±-------+ | 6 | 02026078@qq.com | NULL | NULL | | 7 | 03990516@qq.com | NULL | NULL | | 9 | 05301926@qq.com | NULL | NULL | | 1 | 06440350@qq.com | 817 | 39 | | 4 | 16752438@qq.com | NULL | NULL | | 2 | 25173782@qq.com | NULL | NULL | | 10 | 56599949@qq.com | NULL | NULL | | 3 | 66328120@qq.com | NULL | NULL | | 5 | 92117196@qq.com | NULL | NULL | | 8 | 93677961@qq.com | NULL | NULL | ±—±----------------±-----------±-------+
分享这个小栈给你的朋友们,一起进步吧。
• 所有用户可根据关注领域订阅专区或所有专区
• 付费订阅:虚拟交易,一经交易不退款;若特殊情况,可3日内客服咨询
• 专区发布评论属默认订阅所评论专区(除付费小栈外)
栈主、嘉宾
- RP钉子栈主
小栈成员
- 栈栈
- 漫步云端1983
- hjt19980227
- 小雨滴