- 不要使用
count(column)
或count(1)
来替代count(*)
,count(*)
是 SQL92 定义的 标准统计行数的语法,跟数据库无关,跟NULL
和非NULL
无关。
注意:count(*)会统计值为 NULL 的行,而 count(列名)不会统计此列为 NULL 值的行。
- 当某一列的值全是
NULL
时,count(column)
的返回结果为 0,但sum(column)
的返回结果为NULL
,因此使用sum()
时需注意NPE
问题- 正例:可以使用如下方式来避免
sum
的NPE
问题: SELECT IF(ISNULL(SUM(g)), 0, SUM(g)) FROM table;
- 正例:可以使用如下方式来避免
- 使用
ISNULL()
来判断是否为NULL
值。 说明:NULL
与任何值的直接比较都为 NULL。NULL <> NULL
的返回结果是NULL
,而不是false
NULL = NULL
的返回结果是NULL
,而不是true
NULL <> 1
的返回结果是NULL
,而不是true
- 如果有全球化需要,所有的字符存储与表示,均以 utf-8 编码,注意字符统计函数 的区别。
SELECT LENGTH("轻松工作");
返回为 12SELECT CHARACTER_LENGTH("轻松工作");
返回为 4- 如果需要存储表情,那么选择 utf8mb4 来进行存储,注意它与 utf-8 编码的区别。
TRUNCATE TABLE
比DELETE
速度快,且使用的系统和事务日志资源少,但TRUNCATE
无事务且不触发trigger
,有可能造成事故,故不建议在开发代码中使用此语句。- 说明:
TRUNCATE TABLE
在功能上与不带WHERE
子句的DELETE
语句相同
- 说明:
- 页面搜索严禁左模糊或者全模糊,如果需要请走搜索引擎来解决。
- 说明:索引文件具有
B-Tree
的最左前缀匹配特性,如果左边的值未确定,那么无法使用此索引
- 说明:索引文件具有
- 表达是与否概念的字段,必须使用
is_xxx
的方式命名,数据类型是unsigned tinyint
( 1 表示是,0 表示否)- 说明:任何字段如果为非负数,必须是
unsigned
。 - 正例:表达逻辑删除的字段名
is_deleted
,1 表示删除,0 表示未删除。
- 说明:任何字段如果为非负数,必须是
- 表名、字段名必须使用小写字母或数字,禁止出现数字开头,禁止两个下划线中间只 出现数字。数据库字段名的修改代价很大,因为无法进行预发布,所以字段名称需要慎重考虑。
- 说明:
MySQL
在Windows
下不区分大小写,但在Linux
下默认是区分大小写。因此,数据库名、表名、字段名,都不允许出现任何大写字母,避免节外生枝. - 正例:sys_admin,rdc_config,level3_name
- 反例:SysAdmin,rdcConfig,level_3_name
- 说明:
- 单表行数超过 500 万行或者单表容量超过 2GB,才推荐进行分库分表。
- 说明:如果预计三年后的数据量根本达不到这个级别,请不要在创建表时就分库分表
- 合适的字符存储长度,不但节约数据库表空间、节约索引存储,更重要的是提升检 索速度。
- 表单、AJAX 提交必须执行 CSRF 安全过滤。
- 说明:
CSRF(Cross-site request forgery)
跨站请求伪造是一类常见编程漏洞。对于存在CSRF
漏洞的应用/网站,攻击者可以事先构造好URL
,只要受害者用户一访问,后台便在用户 不知情情况下对数据库中用户参数进行相应修改。
- 说明:
- 泛型通配符
<? extends T>
来接收返回的数据,此写法的泛型集合不能使用add()
方法,而<? super T>
不能使用get()
方法,做为接口调用赋值时易出错。
- 说明:扩展说一下
PECS(Producer Extends Consumer Super)
原则: - 第一、频繁往外读取内 容的,适合用
<? extends T>
。 - 第二、经常往里插入的,适合用
<? super T>
。
- 使用工具类
Arrays.asList()
把数组转换成集合时,不能使用其修改集合相关的方 法,它的add/remove/clear
方法会抛出UnsupportedOperationException
异常。
- 说明:
asList
的返回对象是一个Arrays
内部类,并没有实现集合的修改方法。Arrays.asList
体现的是适配器模式,只是转换接口,后台的数据仍是数组。