zoukankan      html  css  js  c++  java
  • mysql的那点事儿,你知道吗

    1、count(*) 和 count(1)和count(列名)区别  

    执行效果上:  
    count(*)包括了所有的列,相当于行数,在统计结果的时候,不会忽略列值为NULL  
    count(1)包括了忽略所有列,用1代表代码行,在统计结果的时候,不会忽略列值为NULL  
    count(列名)只包括列名那一列,在统计结果的时候,会忽略列值为空(这里的空不是只空字符串或者0,而是表示null)的计数,即某个字段值为NULL时,不统计。

    执行效率上:  
    列名为主键,count(列名)会比count(1)快  
    列名不为主键,count(1)会比count(列名)快  
    如果表多个列并且没有主键,则 count(1) 的执行效率优于 count(*)  
    如果有主键,则 select count(主键)的执行效率是最优的  
    如果表只有一个字段,则 select count(*)最优。

    2、校对规则

    MySQL在Linux下数据库名、表名、列名、别名大小写规则是这样的:

    1、数据库名与表名是严格区分大小写的;

    2、表的别名是严格区分大小写的;

    3、列名与列的别名在所有的情况下均是忽略大小写的;

    4、字段内容默认情况下是大小写不敏感的。

    因为默认情况下字段内容是不区分大小写的,也即大小写不敏感。所以解决方案就是要新增字段内容的校验规则。

    使用mysql 的BINARY 关键字使搜索区分大小写。

    在查询的sql中加入BINARY 关键字,select * from tb_user where BINARY username ='user';

    这种方式相对较简单,不用改动表结构,只需在需要区分查询的字段前加上关键字。这种方式也是有缺点的,每次写查询的时候都要注意加关键字,并可能需要改动的代码较多。

    在创建表的时候进行限制

    CREATE TABLE `tb_user1` (
        `id` BIGINT (20) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '用户id',
        `username` VARCHAR (50) BINARY NOT NULL COMMENT '用户名',
        PRIMARY KEY (`id`)
    ) ENGINE = INNODB DEFAULT CHARSET = utf8 COMMENT = '用户表';
    
    
    mysql> show create table tb_user1;
    tb_user1 | CREATE TABLE `tb_user1` (
      `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '用户id',
      `username` varchar(50) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL COMMENT '用户名',
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='用户表'
    1 row in set
    

    或者 使用

    CREATE TABLE `tb_user2` (
        `id` BIGINT (20) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '用户id',
        `username` VARCHAR (50) NOT NULL COMMENT '用户名',
        `info` VARCHAR (100) NOT NULL COMMENT '详情描述',
        PRIMARY KEY (`id`)
    ) ENGINE = INNODB DEFAULT CHARSET = utf8 COLLATE=utf8_bin COMMENT = '用户表';
    
    mysql> show create table tb_user2;
    tb_user2 | CREATE TABLE `tb_user2` (
      `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '用户id',
      `username` varchar(50) COLLATE utf8_bin NOT NULL COMMENT '用户名',
      `info` varchar(100) COLLATE utf8_bin NOT NULL COMMENT '详情描述',
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='用户表'
    

    使用 NGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin会将字段中varchar类型的全部设置区分大小写。这两种查看表的详情,本质上都是 在字段上 加上了 COLLATE utf8_bin

    总结:

    字段值的大小写由mysql的校对规则来控制。提到校对规则,就不得不说字符集。字符集是一套符号和编码,校对规则是在字符集内用于比较字符的一套规则。 一般而言,校对规则以其相关的字符集名开始,通常包括一个语言名,并且以ci(大小写不敏感)、cs(大小写敏感)或_bin(二元)结束 。

    比如 utf8字符集,,如下表:

    1)utf8bin:utf8bin将字符串中的每一个字符用二进制数据存储,区分大小写。

    2)utf8generalci:utf8generaci不区分大小写,ci为case insensitive的缩写,即大小写不敏感。

    3)utf8generalcs:utf8generalcs区分大小写,cs为case sensitive的缩写,即大小写敏感。

    3、ON DUPLICATE KEY UPDATE

    mysql提供了这样的语法,即当我们往表里插数据里,如果数据已经存在(通过主键或唯一索引确定),我们可以对已存在的记录做更新操作。如:

    INSERT USER(id,username) VALUES(1,'张三丰') ON DUPLICATE KEY UPDATE username='王老五'
    面的sql意思是,如果id为1的记录不存在,则insert一条id=1、username=张三丰的记录;否,将id为1记录的username改为王老五。这只是插入单行数据,mysql甚至支持批量操作,如:INSERT INTO table (id,a,b,c) select id,a,b,c from xxx ON DUPLICATE KEY UPDATE a=VALUES(a),b=VALUES(b),c=VALUES(c)

    即通过insert into ...from 来批量插入,然后通过values(xxx)来取得结果集中对应的字段值。

  • 相关阅读:
    20160205.CCPP体系详解(0015天)
    盘点各专业到古代都能干些啥
    一份简单的在 Linux下编译及调试 C 代码的指南
    WordPress Gravatar国内加载缓慢解决办法
    linux修改mysql字符集编码
    阿里合伙人邵晓锋:什么是创业者应该抵制的诱惑?
    6月27日云栖精选夜读:细数智能家居的痛点
    6月26日云栖精选夜读:成为一名Java高级工程师你需要学什么
    搭建百万级别邮件发送平台
    黑科技实验室:这些高级装备厉害了!
  • 原文地址:https://www.cnblogs.com/pretty-sunshine/p/13229445.html
Copyright © 2011-2022 走看看