总结些MySQL在开发中注意点
1、MySQL中varchar(20)能存放多少汉字?
具体存放多少汉字跟MySQL版本有关:
- 4.0版本以下,varchar(20),指的是20字节,如果存放UTF8汉字时,只能存6个(每个汉字3字节)
- 5.0版本以上,varchar(20),指的是20字符,无论存放的是数字、字母还是UTF8汉字(每个汉字3字节),都可以存放20个
2、unsigned用途:
-
unsigned 为“无符号”的意思,unsigned既为非负数
-
mysql提供了五种整型: tinyint、smallint、mediumint、int和bigint。int为integer的缩写。这些类型在可表示的取值范围上是不同的。 整数列可定义为unsigned从而禁用负值;这使列的取值范围为0以上。各种类型的存储量需求也是不同的。取值范围较大的类型所需的存储量较大。
-
mysql 提供三种浮点类型: float、double和decimal。与整型不同,浮点类型不能是unsigned的,其取值范围也与整型不同,这种不同不仅在于这些类型有最大 值,而且还有最小非零值。最小值提供了相应类型精度的一种度量,这对于记录科学数据来说是非常重要的(当然,也有负的最大和最小值)。
3、SQL关联查询中条件在on后与在where后的区别
- A B两表左关联查询,A.id =B.ref_id
a、select * from A left join B on A.id =B.ref_id and and A.is_deleted =0 where A.name = XXX and B.status=0
b、select * from A left join B on A.id =B.ref_id where A.name = XXX and B.status=0 and A.is_deleted =0
两种写法的结果不一样:
a 中A.id =B.ref_id 关联条件之后能关联的数据,但是由于在右表中不符合A.is_deleted =0 的数据就不会和左表去做关联了。(先筛选再关联)
b 会造成本来用 A.id =B.ref_id 关联条件之后能关联的数据,关联了之后再去筛选 A.is_deleted =0 (先关联再筛选)
4、MySQL报错
- mysql中错误:1093-You can’t specify target table for update in FROM clause的解决方法
不能对进行查询操作单额表进行update、delete操作,MySQL不支持查询同时修改,可已经查询条件再包一层作为另一张表,再做update或delete。
5、in是否走索引
in通常是走索引的,当in后面的数据在数据表中超过30%(上面的例子的匹配数据大约6000/16000 = 37.5%)的匹配时,会走全表扫描,即不走索引,因此in走不走索引和后面的数据有关系。