深入探究Mysql模糊查詢是否區(qū)分大小寫(xiě)
前言
近期,一直在忙著寫(xiě)一個(gè)小小的個(gè)人博客項(xiàng)目,在實(shí)現(xiàn) “全局搜索” 功能時(shí),發(fā)現(xiàn)mysql模糊查詢語(yǔ)句有點(diǎn)兒神奇(本小白剛剛步入編程階段,所以可能讓大家見(jiàn)笑了,哈哈哈),有時(shí)候 mysql模糊查詢語(yǔ)句區(qū)分大小寫(xiě),有時(shí)候 mysql查詢語(yǔ)句又不區(qū)分度大小寫(xiě),于是,做了很多次實(shí)驗(yàn),得出以下結(jié)論(可能有不對(duì)的地方,歡迎大佬們可以指出我的不足,也歡迎小伙伴們可以一起討論問(wèn)題!)
先來(lái)介紹一下COLLATE,COLLATE通常是和數(shù)據(jù)編碼(CHARSET)相關(guān)的,一般來(lái)說(shuō)每種CHARSET都有多種它所支持的COLLATE,并且每種CHARSET都指定一種COLLATE為默認(rèn)值。例如latin1編碼的默認(rèn)COLLATE為latin1_swedish_ci,gbk編碼的默認(rèn)COLLATE為gbk_chinese_ci,utf8mb4編碼的默認(rèn)值為utf8mb4_general_ci:
CHSRSET | COLLATE |
---|---|
latin1 | latin1_swedish_ci |
gbk | gbk_chinese_ci |
utf8mb4 | utf8mb4_general_ci |
utf8 | utf8_bin |
有興趣的小伙伴,可以在navicate等數(shù)據(jù)庫(kù)可視化工具中,自己嘗試一下:
注意:mysql中有utf8和utf8mb4兩種編碼,但是mysql中的utf8最多只能支持3bytes長(zhǎng)度的字符編碼,所以,建議大家還是選擇utf8mb4編碼格式;
解決方法一
如圖所示,為了便于區(qū)分,讓小伙伴們更好地理解,在此,本小白建立了兩個(gè)一模一樣的數(shù)據(jù)庫(kù),其中一個(gè)采用utf8編碼格式,另外一個(gè)采用utf8mb4格式:
區(qū)分大小寫(xiě)
建表語(yǔ)句也采用utf8編碼格式:
建表語(yǔ)句
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;
數(shù)據(jù)庫(kù)內(nèi)容
查詢結(jié)果 select * from t_blog
where title
like ‘%html%';
select * from t_blog
where title
like ‘%HTML%';
結(jié)論:
mysql采用utf8編碼格式,模糊查詢區(qū)分大小寫(xiě)
不區(qū)分大小寫(xiě)
建表語(yǔ)句
建表語(yǔ)句也采用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;
數(shù)據(jù)庫(kù)內(nèi)容
查詢結(jié)果 select * from t_blog
where title
like ‘%html%';
select
* from t_blog
where title
like ‘%HTML%';
結(jié)論
mysql采用utf8mb4編碼格式,模糊查詢不區(qū)分大小寫(xiě)
解決方法二
區(qū)分大小寫(xiě)
方法
單獨(dú)指定所需字段(比如,在此處 我所需要區(qū)分大小寫(xiě)的字段為表 ‘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;
結(jié)論
select * from t_blog
where title
like ‘%HTML%';
select * from t_blog
where title
like ‘%html%';
由上述執(zhí)行結(jié)果可以看出,此方法可以使模糊查詢語(yǔ)句區(qū)分大小寫(xiě);
不區(qū)分大小寫(xiě)
方法
單獨(dú)指定所需字段(比如,在此處 我所需要不區(qū)分大小寫(xiě)的字段為表 ‘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;
結(jié)論 select * from t_blog
where title
like ‘%HTML%';
select * from t_blog
where title
like ‘%html%';
由上述執(zhí)行結(jié)果可以看出,此方法可以使模糊查詢語(yǔ)句不區(qū)分大小寫(xiě);
解決辦法三
區(qū)分大小寫(xiě)
方法
如圖所示,當(dāng)前 ‘t_blog' 表格的 ‘title' 字段的 COLLATE 為 ‘utf8mb4_general_ci' ,不區(qū)分大小寫(xiě)
修改字段為BINARY:
alter table t_blog CHANGE `title` `title` varchar(255) BINARY NULL DEFAULT NULL;
alter table `t_blog` modify column `title` varchar(255) BINARY NULL DEFAULT NULL;
兩種修改方式選擇一種既可
結(jié)論
select * from t_blog
where title
like ‘%HTML%';
select * from t_blog
where title
like ‘%html%';
由上述執(zhí)行結(jié)果可以看出,修改字段為BINARY,可以使模糊查詢語(yǔ)句區(qū)分大小寫(xiě);
解決辦法四
區(qū)分大小寫(xiě)
方法
如圖所示,當(dāng)前 ‘t_blog' 表格的 ‘title' 字段的 COLLATE 為 ‘utf8mb4_general_ci' ,不區(qū)分大小寫(xiě)
查詢語(yǔ)句字段前面加BINARY:
select * from `t_blog` where BINARY `title` like '%html%';
結(jié)論
select * from t_blog
where title
like ‘%html%';
select * from t_blog
where BINARY title
like ‘%html%';
由上述執(zhí)行結(jié)果可以看出,在查詢語(yǔ)句字段前面加BINARY,可以使模糊查詢語(yǔ)句區(qū)分大小寫(xiě)。
解決辦法五
(特別特別不推薦,盡量不要使用)
找到mysql相應(yīng)版本下的my.ini文件,本小白對(duì)應(yīng)的8.0.17版本;
在文件最后一行加上下面一句話:
lower_case_table_names=1
注意:0:區(qū)分大小寫(xiě),1:不區(qū)分大小寫(xiě)
重啟mysql
本小白還有很多地方講解的不夠清楚明了,還請(qǐng)各位大佬指教!想更深入了解的可以參考大佬的博客(膜拜膜拜)mysql區(qū)分大小寫(xiě)
總結(jié)
到此這篇關(guān)于Mysql模糊查詢是否區(qū)分大小寫(xiě)的文章就介紹到這了,更多相關(guān)Mysql模糊查詢大小寫(xiě)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Mysql數(shù)據(jù)庫(kù)安裝完成后需要進(jìn)行的6個(gè)后續(xù)操作
這篇文章主要介紹了Mysql數(shù)據(jù)庫(kù)安裝完成后需要進(jìn)行的6個(gè)操作,即安裝完成后的后續(xù)操作,需要的朋友可以參考下2014-06-06MySQL中SHOW DATABASES語(yǔ)句查看或顯示數(shù)據(jù)庫(kù)
在MySQL中,可使用SHOW DATABASES語(yǔ)句來(lái)查看或顯示當(dāng)前用戶權(quán)限范圍以內(nèi)的數(shù)據(jù)庫(kù),下面就來(lái)介紹一下如何使用,具有一定的參考價(jià)值,感興趣的可以了解一下2024-02-02mysql如何增加數(shù)據(jù)表的字段(ALTER)
這篇文章主要介紹了mysql如何增加數(shù)據(jù)表的字段(ALTER),具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-11-11MySQL中一條update語(yǔ)句是如何執(zhí)行的
這篇文章主要給大家介紹了關(guān)于MySQL中一條update語(yǔ)句是如何執(zhí)行的相關(guān)資料,由于update涉及到數(shù)據(jù)的修改,所以很容易推斷,update語(yǔ)句比select語(yǔ)句會(huì)更復(fù)雜一些,需要的朋友可以參考下2022-03-03MySql Group By對(duì)多個(gè)字段進(jìn)行分組的實(shí)現(xiàn)方法
這篇文章主要介紹了MySql Group By對(duì)多個(gè)字段進(jìn)行分組的實(shí)現(xiàn)方法,需要的朋友可以參考下2017-09-09