前言

近期,一直在忙着写一个小小的个人博客项目,在实现 “全局搜索” 功能时,发现mysql模糊查询语句有点儿神奇(本小白刚刚步入编程阶段,所以可能让大家见笑了,哈哈哈),有时候 mysql模糊查询语句区分大小写,有时候 mysql查询语句又不区分度大小写,于是,做了很多次实验,得出以下结论(可能有不对的地方,欢迎大佬们可以指出我的不足,也欢迎小伙伴们可以一起讨论问题!)

先来介绍一下COLLATE,COLLATE通常是和数据编码(CHARSET)相关的,一般来说每种CHARSET都有多种它所支持的COLLATE,并且每种CHARSET都指定一种COLLATE为默认值。例如latin1编码的默认COLLATE为latin1_swedish_cigbk编码的默认COLLATE为gbk_chinese_ciutf8mb4编码的默认值为utf8mb4_general_ci

CHSRSET COLLATE
latin1 latin1_swedish_ci
gbk gbk_chinese_ci
utf8mb4 utf8mb4_general_ci
utf8 utf8_bin

有兴趣的小伙伴,可以在navicate等数据库可视化工具中,自己尝试一下:




注意:mysql中有utf8utf8mb4两种编码,但是mysql中的utf8最多只能支持3bytes长度的字符编码,所以,建议大家还是选择utf8mb4编码格式;

解决方法一

如图所示,为了便于区分,让小伙伴们更好地理解,在此,本小白建立了两个一模一样的数据库,其中一个采用utf8编码格式,另外一个采用utf8mb4格式:

区分大小写

建表语句也采用utf8编码格式:

建表语句

blog_test : utf8编码格式

SET NAMES utf8;SET FOREIGN_KEY_CHECKS = 0;-- ------------------------------ Table structure for t_blog-- ----------------------------DROP TABLE IF EXISTS `t_blog`;CREATE TABLE `t_blog`  (  `id` bigint(20) NOT NULL AUTO_INCREMENT,  `appreciation` bit(1) NOT NULL,  `comment_tabled` bit(1) NOT NULL,  `content` longtext CHARACTER SET utf8 COLLATE utf8_bin NULL,  `create_time` datetime(0) NULL DEFAULT NULL,  `first_picture` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,  `flag` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,  `published` bit(1) NOT NULL,  `recommend` bit(1) NOT NULL,  `share_statement` bit(1) NOT NULL,  `title` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,  `update_time` datetime(0) NULL DEFAULT NULL,  `views` int(11) NULL DEFAULT NULL,  `type_id` bigint(20) NULL DEFAULT NULL,  `user_id` bigint(20) NULL DEFAULT NULL,  `description` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,  PRIMARY KEY (`id`) USING BTREE,  INDEX `FK292449gwg5yf7ocdlmswv9w4j`(`type_id`) USING BTREE,  INDEX `FK8ky5rrsxh01nkhctmo7d48p82`(`user_id`) USING BTREE,  CONSTRAINT `FK292449gwg5yf7ocdlmswv9w4j` FOREIGN KEY (`type_id`) REFERENCES `t_type` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT,  CONSTRAINT `FK8ky5rrsxh01nkhctmo7d48p82` FOREIGN KEY (`user_id`) REFERENCES `t_user` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT) ENGINE = InnoDB AUTO_INCREMENT = 14 CHARACTER SET = utf8 COLLATE = utf8_bin ROW_FORMAT = Dynamic;

查询结果 select * from t_blog where title like ‘%html%';

select * from t_blog where title like ‘%HTML%';

结论:

mysql采用utf8编码格式,模糊查询区分大小写

不区分大小写

建表语句

建表语句也采用utf8mb4编码格式:

blog_test2 : utf8mb4编码格式

SET NAMES utf8mb4;SET FOREIGN_KEY_CHECKS = 0;-- ------------------------------ Table structure for t_blog-- ----------------------------DROP TABLE IF EXISTS `t_blog`;CREATE TABLE `t_blog`  (  `id` bigint(20) NOT NULL AUTO_INCREMENT,  `appreciation` bit(1) NOT NULL,  `comment_tabled` bit(1) NOT NULL,  `content` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL,  `create_time` datetime(0) NULL DEFAULT NULL,  `first_picture` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,  `flag` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,  `published` bit(1) NOT NULL,  `recommend` bit(1) NOT NULL,  `share_statement` bit(1) NOT NULL,  `title` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,  `update_time` datetime(0) NULL DEFAULT NULL,  `views` int(11) NULL DEFAULT NULL,  `type_id` bigint(20) NULL DEFAULT NULL,  `user_id` bigint(20) NULL DEFAULT NULL,  `description` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,  PRIMARY KEY (`id`) USING BTREE,  INDEX `FK292449gwg5yf7ocdlmswv9w4j`(`type_id`) USING BTREE,  INDEX `FK8ky5rrsxh01nkhctmo7d48p82`(`user_id`) USING BTREE,  CONSTRAINT `FK292449gwg5yf7ocdlmswv9w4j` FOREIGN KEY (`type_id`) REFERENCES `t_type` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT,  CONSTRAINT `FK8ky5rrsxh01nkhctmo7d48p82` FOREIGN KEY (`user_id`) REFERENCES `t_user` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT) ENGINE = InnoDB AUTO_INCREMENT = 14 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic;

查询结果 select * from t_blog where title like ‘%html%';

select

* from t_blog where title like ‘%HTML%';

结论

mysql采用utf8mb4编码格式,模糊查询不区分大小写

解决方法二

区分大小写

方法

单独指定所需字段(比如,在此处 我所需要区分大小写的字段为表 ‘t_blog' 中的 ‘title' 字段)为 ‘utf8' 编码格式,COLLATE 为“utf8_bin”;

alter table t_blog CHANGE `title` `title` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL;

select * from t_blog where title like ‘%HTML%';

select * from t_blog where title like ‘%html%';

由上述执行结果可以看出,此方法可以使模糊查询语句区分大小写

不区分大小写

方法

单独指定所需字段(比如,在此处 我所需要不区分大小写的字段为表 ‘t_blog' 中的 ‘title' 字段)为 ‘utf8mb4' 编码格式,COLLATE 为“utf8mb4_bin”:

alter table t_blog CHANGE `title` `title` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL;

select * from t_blog where title like ‘%html%';

由上述执行结果可以看出,此方法可以使模糊查询语句不区分大小写

解决办法三

区分大小写

方法

如图所示,当前 ‘t_blog' 表格的 ‘title' 字段的 COLLATE 为 ‘utf8mb4_general_ci' ,不区分大小写

修改字段为BINARY:

alter table t_blog CHANGE `title` `title` varchar(255) BINARY NULL DEFAULT NULL;

结论

select * from t_blog where title like ‘%HTML%';

select * from t_blog where title like ‘%html%';

由上述执行结果可以看出,修改字段为BINARY,可以使模糊查询语句区分大小写

解决办法四

区分大小写

方法

如图所示,当前 ‘t_blog' 表格的 ‘title' 字段的 COLLATE 为 ‘utf8mb4_general_ci' ,不区分大小写

查询语句字段前面加BINARY:

select * from `t_blog` where BINARY `title` like '%html%';

select * from t_blog where title like ‘%html%';

select * from t_blog where BINARY title like ‘%html%';

由上述执行结果可以看出,在查询语句字段前面加BINARY,可以使模糊查询语句区分大小写

解决办法五

(特别特别不推荐,尽量不要使用)

找到mysql相应版本下的my.ini文件,本小白对应的8.0.17版本;


在文件最后一行加上下面一句话:

lower_case_table_names=1

重启mysql

本小白还有很多地方讲解的不够清楚明了,还请各位大佬指教!想更深入了解的可以参考大佬的博客(膜拜膜拜)mysql区分大小写

总结

更多相关文章

  1. Android(安卓)模糊搜索rawquery bind or column index out of ra
  2. Android横向智能刷新框架-SmartRefreshHorizontal+ScrollView 实
  3. android studio 更改快捷键为eclipse中习惯的方式
  4. 在Mac下编译 android 源代码
  5. Android(安卓)模糊效果 FastBlur
  6. android实现图片模糊背景效果
  7. android背景模糊化处理
  8. Android(安卓)模糊搜索rawquery bind or column index out of ra
  9. Android(安卓)高斯模糊 RenderScript封装工具类

随机推荐

  1. php数组去重的方法
  2. php购物车的实现原理
  3. PHP相应button中的onclick事件
  4. php主键的作用
  5. php面向对象三大特性
  6. php类和对象的关系
  7. 深入理解PHP与WEB服务器交互
  8. php变量的作用域
  9. php语言的优势是什么
  10. 原生 PHP 实现支付宝 App 第三方登录获取