暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

使用 MySQL 时,对大小写是否敏感得心里有数

每天一个开发小知识。

最近在看《MySQL 技术内幕:InnoDB 存储引擎》,想起之前遇到的一个 MySQL Bug。

这里有一个简化的表:

    CREATE TABLE `t_api_table` (
    `id` int(11) NOT NULL AUTO_INCREMENT,
      `kpi` varchar(64NOT NULL COMMENT '指标',
    `value` bigint(20) DEFAULT NULL COMMENT '指标值',
      PRIMARY KEY (`id`),
    )
    复制

    当我们 insert 这两个 kpi = 'this_is_a_kpi' 和 kpi = 'THIS_IS_A_KPI' 时(insert之前会判断 kpi 是否已经存在),会发现并不是预期中的生成两条记录,而是只是生成一条记录。

    这是因为 Linux 下,MySQL 中的 value 对大小写不敏感,也就是说,对于 MySQL 来说,kpi = 'this_is_a_kpi' 和 kpi = 'THIS_IS_A_KPI' 是同一个值。

    如果,我们需要 MySQL 对 value 的大小写敏感,需要修改 kpi 字段的属性,新增 COLLATE utf8_bin 属性,建表语句如下:

      CREATE TABLE `t_api_table` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
        `kpi` varchar(64COLLATE utf8_bin NOT NULL COMMENT '指标',
      `value` bigint(20) DEFAULT NULL COMMENT '指标值',
        PRIMARY KEY (`id`),
      )
      复制

      如果,我们需要对表的所有字段的 value 都大小写敏感,则添加表的属性 COLLATE=utf8_bin 即可:

        CREATE TABLE `t_api_table` (
        `id` int(11) NOT NULL AUTO_INCREMENT,
          `kpi` varchar(64NOT NULL COMMENT '指标',
        `value` bigint(20) DEFAULT NULL COMMENT '指标值',
        PRIMARY KEY (`id`),
        ) COLLATE=utf8_bin
        复制

        最后,顺便说下,在 Linux 环境下,MySQL 对以下大小写的默认情况:

        1. 数据库名,表名大小写敏感;

        2. 字段名大小写敏感;

        3. 字段名对应的 value 不敏感。


        每天一个开发小知识,今天你学废了吗?
        文章转载自每天一个开发小知识,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

        评论