字符集_第07期:有关 MySQL 字符集的 SQL 语句
本篇為理清字符集的續篇(上一篇:第06期:梳理 MySQL 字符集的相關概念),重點講述字符集涉及到的 sql 語句用法。
一、character introducer
翻譯過來就是字符引導。也就是針對字符串,顯式的給定一個字符編碼和排序規則,不受系統參數的影響。
語法很簡單:
[_charset_name] 'string' [COLLATE collation_name]示例:
字符串"北京加油?!"
-- 字符集 utf8mb4,排序規則 utf8mb4_binselect _utf8mb4 "北京加油?!" collate utf8mb4_bin as result;+------------------+| result |+------------------+| 北京加油?! |+------------------+1 row in set (0.00 sec)-- 字符集 utf8mb4,collate 字句缺失,此時對應排序規則為utf8mb4_w0900_ai_ciselect _utf8mb4 "北京加油?!" as result;+------------------+| result |+------------------+| 北京加油?! |+------------------+1 row in set (0.00 sec)-- 字符集缺失,此時字符集按照參數 @@character_set_connection 值來指定。mysql> select "北京加油?!" collate gb18030_chinese_ci as result;ERROR 1253 (42000): COLLATION 'gb18030_chinese_ci' is not valid for CHARACTER SET 'utf8mb4'-- 查看變量 @@character_set_connection,確認其字符集不包含排序規則 gb18030_chinese_ci,所以以上語句報錯。mysql> select @@character_set_connection;+----------------------------+| @@character_set_connection |+----------------------------+| utf8mb4 |+----------------------------+1 row in set (0.00 sec)-- 那給下正確的排序規則 utf8mb4_bin,執行正確。mysql> select "北京加油?!" collate utf8mb4_bin as result;+------------------+| result |+------------------+| 北京加油?! |+------------------+1 row in set (0.00 sec)-- 字符集和排序規則都不指定,此時字符串對應的字符集和排序規則和參數 @@character_set_connection 一致。select "北京加油?!" as result;-- 那這條語句其實被 MySQL 解釋為select _utf8mb4 "北京加油?!" collate utf8mb4_0900_ai_ci as result;總結 Introducer 使用規則:
二、字符集轉換函數
1. convert 函數
convert 函數類似于 introducer,不過只能指定字符集。
舉個例子,通過 convert 函數轉換字符串"北京加油?!"的編碼為 utf8mb4。不過前提是轉換前后字符集一定要兼容。
-- 正確的轉換mysql> select convert("北京加油?!" using utf8mb4) ;+-------------------------------------------+| convert("北京加油?!" using utf8mb4) |+-------------------------------------------+| 北京加油?! |+-------------------------------------------+1 row in set (0.00 sec)-- 錯誤的轉換,字符集編碼不兼容。mysql> select convert("北京加油?!" using latin1) ;+------------------------------------------+| convert("北京加油?!" using latin1) |+------------------------------------------+| ?????! |+------------------------------------------+1 row in set (0.00 sec)2. charset 函數
檢測字符串的字符集??梢詸z測出當前字符串在當前 session 的字符集。
mysql> set @a="北京加油?!";Query OK, 0 rows affected (0.00 sec)mysql> select charset(@a);+-------------+| charset(@a) |+-------------+| utf8 |+-------------+1 row in set (0.00 sec)3. set names 語句
語法為:
SET NAMES {'charset_name'[COLLATE 'collation_name'] | DEFAULT}這條語句最常用,可是也最容易被濫用,比如語句:
set names latin1 collate latin1_bin;執行后會默認執行一系列語句,也就是把非服務端的相關參數給重新設定了。
set session character_set_results = latin1;set session character_set_client = latin1;set session character_set_connection=latin1;set session collation_connection = latin1_bin;那現在重新執行確認一下,跟 introducer 一樣,沒有指定 collate 語句,默認為字符集對應的排序規則。
mysql> set names latin1 ;Query OK, 0 rows affected (0.00 sec)-- 那這里看到相關參數值全部被改了。mysql> select * from performance_schema.session_variables where variable_name in ('character_set_connection','collation_connection','character_set_results','character_set_client');+--------------------------+-------------------+| VARIABLE_NAME | VARIABLE_VALUE |+--------------------------+-------------------+| character_set_client | latin1 || character_set_connection | latin1 || character_set_results | latin1 || collation_connection | latin1_swedish_ci |+----------------------------------------------+那如果想改回默認值,簡單執行:
mysql> set names default;Query OK, 0 rows affected (0.00 sec)mysql> select * from performance_schema.session_variables where variable_name in ('character_set_connection','collation_connection','character_set_results','character_set_client');+--------------------------+--------------------+| VARIABLE_NAME | VARIABLE_VALUE |+--------------------------+--------------------+| character_set_client | utf8mb4 || character_set_connection | utf8mb4 || character_set_results | utf8mb4 || collation_connection | utf8mb4_0900_ai_ci |+--------------------------+--------------------+4 rows in set (0.00 sec)不過有一點要注意的是,并不是所有字符集都適用于這條語句,比如定長字符集 utf32,設置就會報錯。因為變量 @@character_set_client 不支持這個字符集。
mysql> set names utf32;ERROR 1231 (42000): Variable 'character_set_client' can't be set to the value of 'utf32'4. set character set 語句
語法為:
SET {CHARACTER SET | CHARSET}{'charset_name' | DEFAULT}類似語句 set names,同樣是設置以下三個 session 參數:
- character_set_results
- character_set_client
- character_set_connection
同樣是可以恢復默認值,還有同樣的限制規則等。
不過有兩點不同:
1)參數 character_set_connection 的值不會被設定為指定的字符集,而是繼承參數 character_set_database 所設定的字符集。
示例:
mysql> set character set latin1;Query OK, 0 rows affected (0.01 sec)-- 檢索結果顯示,參數 character_set_connection 的值和 character_set_database 的值一致。mysql> select * from performance_schema.session_variables where variable_name in ('character_set_connection','collation_connection','character_set_database','character_set_results','character_set_client');+--------------------------+--------------------+| VARIABLE_NAME | VARIABLE_VALUE |+--------------------------+--------------------+| character_set_client | latin1 || character_set_connection | utf8mb4 || character_set_database | utf8mb4 || character_set_results | latin1 || collation_connection | utf8mb4_0900_ai_ci |+--------------------------+--------------------+5 rows in set (0.00 sec)2)只用來設置字符集,不能定義具體的排序規則名稱,也就是排序規則名稱都是字符集對應的默認排序規則名稱。這點從以上例子就可以看出來。
5. collate 子句
collate 語句強制指定排序規則,優先級最高。也就是顯式指定 collate 會覆蓋已有的排序規則。
這里涉及到單個字符串以及字符串拼接的排序規則問題。
顯式的指定排序方式
-- 示例表 c1,mysql> create table c1 (n char(1));Query OK, 0 rows affected (0.06 sec)-- 插入示例數據,英文大小寫字母亂序插入mysql> insert into c1 with recursive a(x,y) as( select 65,97 union all select x+1,y+1 from a where x<90)select char(x using ascii) x from aunion allselect char(y using ascii) y from a order by rand();Query OK, 52 rows affected (0.02 sec)Records: 52 Duplicates: 0 Warnings: 0改變 order by 的排序規則。
-- 原有排序結果mysql> select n from c1 order by n desc limit 6;+------+| n |+------+| Z || z || y || Y || x || X |+------+6 rows in set (0.00 sec)-- collate 顯式指定后,排序結果。mysql> select n from c1 order by n collate utf8mb4_0900_bin desc limit 6;+------+| n |+------+| z || y || x || w || v || u |+------+6 rows in set (0.00 sec)用于具體的列別名
mysql> select n collate utf8mb4_bin as n from c1 order by n desc limit 6;+------+| n |+------+| z || y || x || w || v || u |+------+6 rows in set (0.01 sec)用于聚合函數
mysql> select max(n) n from c1;+------+| n |+------+| Z |+------+1 row in set (0.00 sec)-- 強制collate結果mysql> select max(n collate utf8mb4_bin) n from c1;+------+| n |+------+| z |+------+1 row in set (0.00 sec)或者用于 where,group by,having 等等。
用于統計排序方式的強制性指標
比如要在 where 條件里過濾字符串,where a = 'a',那此時是用 a 的排序規則,還是字符 'a' 的排序規則,這里就涉及到一個排序規則的強制性指標。
MySQL 的排序規則強制性指標值 從 0 到 6 一共 7 個。數字指標越小,優先級越高。以下為指標值說明:
同時,為了便于大家理解,MySQL 提供了如何檢測這個指標的函數 coercibility,舉幾個例子看下:
示例:
SET?NAMES?{'charset_name'[COLLATE 'collation_name'] | DEFAULT}總結
對于字符集的控制相關 SQL 就介紹的差不多了。主要舉例介紹了 MySQL 字符集相關的處理 SQL 語句,比如設置客戶端相關編碼語句:SET NAMES/SET CHARSET;設置排序規則語句:COLLATE;給 MySQL 信號的 introducer 等。希望對大家有幫助。
關于 MySQL 的技術內容,你們還有什么想知道的嗎?趕緊留言告訴小編吧!
總結
以上是生活随笔為你收集整理的字符集_第07期:有关 MySQL 字符集的 SQL 语句的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: git获取本地版本号_Git使用小结
- 下一篇: mysql不复制数据_windows m