日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

字符集_第07期:有关 MySQL 字符集的 SQL 语句

發布時間:2023/12/2 数据库 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 字符集_第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 语句的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。