专栏名称: 码小辫
给程序员和编程爱好者分享计算机编程电子书以及相关的学习资源
目录
相关文章推荐
传感器专家网  ·  重庆大学: 研究用于语音识别和交互的机器学习 ... ·  16 小时前  
传感器专家网  ·  重庆大学: 研究用于语音识别和交互的机器学习 ... ·  16 小时前  
质量与认证  ·  关注 | ... ·  昨天  
质量与认证  ·  关注 | ... ·  昨天  
AIGC开放社区  ·  重磅!OpenAI开源首个Agent ... ·  2 天前  
AIGC开放社区  ·  重磅!OpenAI开源首个Agent ... ·  2 天前  
AIGC开放社区  ·  微软AI开发者挑战赛 | ... ·  3 天前  
AIGC开放社区  ·  微软AI开发者挑战赛 | ... ·  3 天前  
51好读  ›  专栏  ›  码小辫

明明表中没这条数据,竟然还能查出来?

码小辫  · 公众号  ·  · 2024-11-12 17:10

正文

前言

当你看到这个标题时,第一反应可能是想:标题搞错了吧?

答:没搞错,各位看官,听我慢慢道来。

我之前写过一篇文章《 明明加了唯一索引,为什么还是产生重复数据? 》,发表之后,被很多博主转载过,引起了全网很多读者的共鸣。

我最近发现,这类出人意料的线上问题,加上知识点总结,加上干货分享,更容易吸引读者。

所以,这篇文章将会延续上篇文章的风格,从一个线上问题开始。

1.还原问题现场

有一天下午,有用户反馈说,它自定义的品牌:yoyo,一直都添加不成功。

我查了一下服务器的日志,并没有异常。

在我们的创建商品页面,用户可以选择已有品牌,也可以自己自定义新的品牌。

前端做了一个品牌的下来列表,为了方便用户查找,支持搜索。

用户可以输入关键字搜索品牌。

如果下拉框中出现了,则可以选择使用。

如果下拉框中没有数据,则在输入框中标识这个品牌是用户自定义的品牌。

然后通过创建商品接口,将该品牌添加到数据库当中。

现在的问题是yoyo这个品牌,用户自定义了,但不能保存到数据库当中。

这就非常奇怪了。

2 分析问题

为了查明这个问题,我先查询了数据库中的品牌表:

select * from brand where `name`='yoyo';

确实没有查出yoyo这个品牌。

但意外查出YOYO这个品牌。

它是yoyo英文字母的大写。

奇怪,我们查小写的yoyo字符串,为什么会把大写的YOYO查出来了?

于是,我查了brand表的表结构。

CREATE TABLE `brand` (
  `id` bigint NOT NULL AUTO_INCREMENT COMMENT 'ID',
  `name` varchar(30NOT NULL COMMENT '品牌名称',
  `create_user_id` bigint NOT NULL COMMENT '创建人ID',
  `create_user_name` varchar(30NOT NULL COMMENT '创建人名称',
  `create_time` datetime(3DEFAULT NULL COMMENT '创建日期',
  `update_user_id` bigint DEFAULT NULL COMMENT '修改人ID',
  `update_user_name` varchar(30)  DEFAULT NULL COMMENT '修改人名称',
  `update_time` datetime(3DEFAULT NULL COMMENT '修改时间',
  `is_del` tinyint(1DEFAULT '0' COMMENT '是否删除 1:已删除 0:未删除',
  PRIMARY KEY (`id`USING BTREE
ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci  COMMENT='品牌表';

品牌表使用的存储引擎ENGINE是InnoDB,为了保证表的事务性。

字符集CHARSET用的utf8mb4,可以保存一些表情符号等特殊字符。

校对规则COLLATE用的utf8_unicode_ci。

字符集是一组符号和编码的集合,而校对规则是用于比较字符集中字符的规则。

例如,utf8mb4字符集支持存储Unicode字符,而utf8mb4_0900_ai_ci校对规则定义了如何比较这些字符。

在MySQL中使用show collation指令,可以查看到所有COLLATE。

以utf8mb4为例,该编码所支持的所有COLLATE如下图所示。

主要包含了三种:







请到「今天看啥」查看全文