1、MySQL的排序規(guī)則是干什么的?
我們在使用 Navicat for MySQL 或 MySQL Workbench 創(chuàng)建數(shù)據(jù)庫的時候,除了數(shù)據(jù)庫名稱和字符集外,我們還可以設(shè)置 Collation【排序規(guī)則】 (當然我們也可以使用默認的排序規(guī)則),那么這里的排序規(guī)則到底是干什么的?
排序規(guī)則概念:是指對指定字符集下不同字符的比較規(guī)則。排序規(guī)則有以下特征:
它和字符集(CHARSET)相關(guān)
每種字符集都有多種它支持的排序規(guī)則
每種字符集都會默認指定一種排序規(guī)則為默認值。
排序規(guī)則作用:排序規(guī)則指定后,它會影響我們使用 ORDER BY語句查詢的結(jié)果順序,會影響到 WHERE條件中大于小于號的篩選結(jié)果,會影響 DISTINCT、GROUP BY、HAVING 語句的查詢結(jié)果。另外,mysql 建索引的時候,如果索引列是字符類型,也會影響索引創(chuàng)建,只不過這種影響我們感知不到。總之,凡是涉及到字符類型比較或排序的地方,都和排序規(guī)則有關(guān)。
2、排序規(guī)則設(shè)置及優(yōu)先級
2.1 排序規(guī)則設(shè)置
排序規(guī)則設(shè)置可以分為:MySQL實例級別、庫級別、表級別、列級別以及SQL指定。
2.1.1 MySQL實例級別設(shè)置
實例級別的排序規(guī)則設(shè)置就是 MySQL 配置文件或啟動指令中的 collation_connection 系統(tǒng)變量。
實例級別設(shè)置排序規(guī)則
可以通過修改mysql的配置文件 my.ini來修改相應(yīng)的排序規(guī)則,修改好后,重啟mysql服務(wù)。
查看MySQL實例級別的字符集和排序規(guī)則
show variables like '%character%';
show variables like '%collation%';
從上圖可以看到,當前實例級別的字符集是 utf8,排序規(guī)則是 utf8-general_ci。
2.1.2 庫級別設(shè)置
庫級別設(shè)置排序規(guī)則
在創(chuàng)建數(shù)據(jù)庫的時候指定數(shù)據(jù)集和排序規(guī)則
CREATE DATABASE TESTDB? ? ? ? ?
DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;?
查看庫級別排序規(guī)則
show create database testdb;
2.1.3 表級別設(shè)置
表級別設(shè)置排序規(guī)則
在創(chuàng)建表的時候指定表的數(shù)據(jù)集和排序規(guī)則
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;
查看表級別排序規(guī)則
show table status from testdb like 'user';
-- testdb 為數(shù)據(jù)庫名, user 為要查看的表名
2.1.4 列級別設(shè)置
列級別設(shè)置排序規(guī)則
在創(chuàng)建表的時候指定列的數(shù)據(jù)集和排序規(guī)則
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;
查看列級別排序規(guī)則
show full columns from user;
2.1.5 SQL指定設(shè)置
SQL語句中指定排序規(guī)則
SELECT id, name FROM `user`
ORDER BY name COLLATE utf8mb4_unicode_ci;
2.2 排序規(guī)則優(yōu)先級
優(yōu)先級順序是 SQL語句 > 列級別設(shè)置 > 表級別設(shè)置 > 庫級別設(shè)置 > 實例級別設(shè)置
也就是說,如果SQL語句中指定了排序規(guī)則,則以其指定為準,否則以下一級為準(也就是列級別),如果列級別沒有指定,默認是繼承表級別的設(shè)置,以此類推。
3、幾種常用排序規(guī)則介紹
我們以字符集utf8mb4為例,常用的排序規(guī)則有:utf8mb4_general_ci、utf8mb4_bin、utf8mb4_unicode_ci。
3.1 utf8mb4_general_ci
ci即case insensitive,不區(qū)分大小寫。沒有實現(xiàn)Unicode排序規(guī)則,在遇到某些特殊語言或者字符集,排序結(jié)果可能不一致,但是,在絕大多數(shù)情況下,這些特殊字符的順序并不需要那么精確。另外,在比較和排序的時候速度更快。
3.2 utf8mb4_bin
將字符串每個字符用二進制數(shù)據(jù)編譯存儲,區(qū)分大小寫,而且可以存二進制的內(nèi)容。
3.3 utf8mb4_unicode_ci文章來源:http://www.zghlxwxcb.cn/news/detail-470649.html
不區(qū)分大小寫,基于標準的Unicode來排序和比較,能夠在各種語言之間精確排序,在特殊情況下,Unicode排序規(guī)則為了能夠處理特殊字符的情況,實現(xiàn)了略微復(fù)雜的排序算法,所以兼容度比較高,但是性能不高。文章來源地址http://www.zghlxwxcb.cn/news/detail-470649.html
到了這里,關(guān)于MySql 排序規(guī)則的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!