1、MySQL的排序規則是干什么的?
我們在使用 Navicat for MySQL 或 MySQL Workbench 創建數據庫的時候,除了數據庫名稱和字符集外,我們還可以設置 Collation【排序規則】 (當然我們也可以使用默認的排序規則),那么這里的排序規則到底是干什么的?
排序規則概念:是指對指定字符集下不同字符的比較規則。排序規則有以下特征:
它和字符集(CHARSET)相關
每種字符集都有多種它支持的排序規則
每種字符集都會默認指定一種排序規則為默認值。
排序規則作用:排序規則指定后,它會影響我們使用 ORDER BY語句查詢的結果順序,會影響到 WHERE條件中大于小于號的篩選結果,會影響 DISTINCT、GROUP BY、HAVING 語句的查詢結果。另外,mysql 建索引的時候,如果索引列是字符類型,也會影響索引創建,只不過這種影響我們感知不到。總之,凡是涉及到字符類型比較或排序的地方,都和排序規則有關。
2、排序規則設置及優先級
2.1 排序規則設置
排序規則設置可以分為:MySQL實例級別、庫級別、表級別、列級別以及SQL指定。
2.1.1 MySQL實例級別設置
實例級別的排序規則設置就是 MySQL 配置文件或啟動指令中的 collation_connection 系統變量。
實例級別設置排序規則
可以通過修改mysql的配置文件 my.ini來修改相應的排序規則,修改好后,重啟mysql服務。
查看MySQL實例級別的字符集和排序規則
show variables like '%character%';
show variables like '%collation%';
從上圖可以看到,當前實例級別的字符集是 utf8,排序規則是 utf8-general_ci。
2.1.2 庫級別設置
庫級別設置排序規則
在創建數據庫的時候指定數據集和排序規則
CREATE DATABASE TESTDB? ? ? ? ?
DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;?
查看庫級別排序規則
show create database testdb;
2.1.3 表級別設置
表級別設置排序規則
在創建表的時候指定表的數據集和排序規則
use testdb;
CREATE TABLE user(
? `id` int(11) NOT NULL,
? `name` varchar(255) DEFAULT NULL,
? PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
查看表級別排序規則
show table status from testdb like 'user';
-- testdb 為數據庫名, user 為要查看的表名
2.1.4 列級別設置
列級別設置排序規則
在創建表的時候指定列的數據集和排序規則
CREATE TABLE `user` (
? `id` int(11) NOT NULL,
? `name` varchar(255) CHARACTER SET utf8mb4 DEFAULT NULL,
? PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
查看列級別排序規則
show full columns from user;
2.1.5 SQL指定設置
SQL語句中指定排序規則
SELECT id, name FROM `user`
ORDER BY name COLLATE utf8mb4_unicode_ci;
2.2 排序規則優先級
優先級順序是 SQL語句 > 列級別設置 > 表級別設置 > 庫級別設置 > 實例級別設置
也就是說,如果SQL語句中指定了排序規則,則以其指定為準,否則以下一級為準(也就是列級別),如果列級別沒有指定,默認是繼承表級別的設置,以此類推。
3、幾種常用排序規則介紹
我們以字符集utf8mb4為例,常用的排序規則有:utf8mb4_general_ci、utf8mb4_bin、utf8mb4_unicode_ci。
3.1 utf8mb4_general_ci
ci即case insensitive,不區分大小寫。沒有實現Unicode排序規則,在遇到某些特殊語言或者字符集,排序結果可能不一致,但是,在絕大多數情況下,這些特殊字符的順序并不需要那么精確。另外,在比較和排序的時候速度更快。
3.2 utf8mb4_bin
將字符串每個字符用二進制數據編譯存儲,區分大小寫,而且可以存二進制的內容。
3.3 utf8mb4_unicode_ci
不區分大小寫,基于標準的Unicode來排序和比較,能夠在各種語言之間精確排序,在特殊情況下,Unicode排序規則為了能夠處理特殊字符的情況,實現了略微復雜的排序算法,所以兼容度比較高,但是性能不高。
————————————————
版權聲明:本文為CSDN博主「leoxyk」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/leoxyk/article/details/99855608