主頁 > 資料庫 > MySQL Charset & Collation 初步學習總結

MySQL Charset & Collation 初步學習總結

2021-01-24 19:09:37 資料庫

寫在前面: 本文——mysql字符集(character set)和排序規則(collation)的初步總結,源于學習程序中對select length('漢字');的好奇,由于學習階段及時間問題,部分疑問最終沒有很好的解決.暫時不再探究,總結粗糙,理解不精,主要為個人學習程序記錄,方便后期復習,僅供網友參考,歡迎提出見解,

MySQL中字符集(character set )指的是由一對對symbol和encoding的對應關系組成的集合(粗略理解為編碼方式),排序規則(collation )主要用于指明字符間的比較方式,( MySQL includes character set support that enables you to store data using a variety of character sets and perform comparisons according to a variety of collations. )詳見8.0手冊第10章總述及10.1節,(本文參考手冊皆指官方mysql 8.0手冊)

  1. MySQL 8.0 默認character set(字符集) and collation(排序規則) 是 utf8mb4utf8mb4_0900_ai_ci, 具體來講可以分別指定 :服務器(server),資料庫(database),表(table),列(column)以及原義字串(character string literal )的character set 和對應的 collation

    • 1.1 查看MySQL支持的[所有的]character set 和collation
      • show character set ; show collation ; 兩者都可添加限定條件陳述句:like或where clause
        #character set 可以簡寫為charset;
        手冊10.3.1 節詳細介紹了character set 和 collation 的命名規則
      • 在MySQL中,全部的charset 與collation的資訊都存放在information_schema庫中,除上述方法外,還可進入information_schema庫中查看CHARACTER_SETS與COLLATIONS表
        use information_schema;
        select * from character_sets,collations [where clause];
    • 1.2查看系統當前設定的各種字符集/排序規則
      show [session ]variables like 'char%'/'collation%';
      select * from performance_schema.session_variables where variable_name like 'character_set_%';
      image-20210117190136461
    表1
    • 1.4 collation 的命名規則參見手冊10.3.1節,
  • 1.5可解如下困惑:

    • 1.4.1 select length('張'); mysql > 2
      在此查詢中,漢字'張' 即原義(或譯為常量?)字串(見手冊10.3.6節/下文2),因在查詢時沒有特別指定character set 以及collation ,故為默認值,由表1:character_set_connection | gbk可知,編碼方式為GBK,而GBK編碼使用兩個位元組來標識漢字字符碼,所以上述運行結果為 2 ,
      • 1.4.2 use pra ;select legnth(stu_name) from stuinfo where stuid = 1; mysql> 6
        image-20210117203039236
        字串' 張三 ' 占用6個位元組,故單個漢字(字符)占用3個位元組,可以解釋為:
        • ① 因:創建pra表中的各欄位時,未特意指定編碼型別,故根據手冊10.3.5可知編碼方式應為其所屬的table的編碼型別,使用3.2命令查看,為默認的utf8b4
        • ② 手冊10.9.1節詳細介紹了utf8b4字符集型別,指明了:
          image-20210117221629613
          • 在編碼 BMP字符時utf8mb4與utf8/utf8mb3 可以大致等同,每個字符編碼存盤都占用相同的位元組數(英文字符1個位元組,漢字3個位元組);走出了各種論壇中的不精確表達" utf8mb4存盤漢字占用4個位元組,utf8mb3占用3個位元組 " 的思維定勢,
          • 在編碼SMP字符時,utf8mb4才占用4個位元組(當然,utf8/utf8mb3 不支持存盤SMP字符,這中字符集型別很快會被官方棄用)
          • 兩種型別同時存在時,一般會自動轉化為utf4mb4型別,
          • BMP字符可以粗略理解為常用字符,SMP理解為不常用字符,比如emoj符號,
        • ③ 詳細的各種型別的字符編碼,可參見博客園:字串,那些事
  1. Character string literal 譯為原義字串,指的是在Query clause 中的字串,脫離于表,與表無關,手冊10.3.6節,

    • 2.1 形式為 [_charset_name]'string' [COLLATE collation_name];

    • 2.2 解釋:The _charset_name expression is formally called an introducer. It tells the parser, “the string that follows uses character set charset_name.”

    • 2.3
      image-20210117202110825

    • 2.4 困惑 在系統CMD視窗
      select length('你') ; mysql>2
      select length(_utf8mb4 '你') ; mysql>2
      運行結果不變,通過命令1.3(表1)可看到character_set_connection = gbk ,①可理解,那么②呢?
      字串'你'之前的 introducer 無效嗎?2.2解釋It tells the parser, “the string that follows   uses character set charset_name.到底什么意思,中間還涉及什么程序,

      • 2.4.1 換用了MySQL Client CMD 運行,連接字符集同樣為gbk,運行結果也都為 2 ,換用navicat命令列執行,連接字符集變為utf8mb4 (client ,results字符集也都變為utf8mb4),兩條select陳述句執行結果都變為 3 (第二條的introducer 修改為 _gbk),
        結論:introducer 對于字串本身沒有影響,還是受character_set_connection或其他變數 影響 (說法不準確)

      • 2.4.2 查閱手冊10.3.8 introducer相關知識:

      An introducer does not change the string to the introducer character set like CONVERT() would do. It does not change the string value, although padding may occur. The introducer is just a signal. (不太理解)
      

      ? ① 查閱12.11節 Cast Functions and operators 的 convert(expr using transcoding_name)函式 :converts data between different character sets. ,貌似是真正的轉換,

      ? ② 這不同于introducer中的表述:It does not change the string value, although padding may occur. The introducer is just a signal(它到底是干嘛的)

      ? ③ 運行 select length(convert('你' using utf8mb4)); mysql> 3 ,而此時character_set_connection 仍然為gbk
      那么結合①,到底introducer 到底發揮什么樣的作用,character_set_connection 發揮什么樣的作用, ?

      • 2.4.3 查看手冊10.4節 Connection character set and collation ,該部分涉及到了客戶端與服務器的互動程序中的編碼轉換程序,

          1. 客戶端與服務器的互動大致涉及三個變數:character_set_client , character_set_conneciton , character_set_results.
          1. 整體程序可粗略解釋如下,更詳細可參考七把刀簡書博文,

          ① 服務器從客戶端接收以character_set_client 編碼的陳述句(statements);
          ② 服務器將接收到的statements 從character_set_client 轉譯(translate/convert)為character_set _connection.
          此處提到:For string literals that have an introducer such as _utf8mb4 or _latin2, the introducer determines the character set. (怎么determine呢,上面沒感覺determine呀)

          ? 又提及:collation_connection 對于literal strings 的比較是重要的,對于表列中的字串的比 較無關緊要 ,
          ③ server 將執行結果以character_set_results 的編碼形式傳回client

          ④:在七把刀簡書博文中的介紹部分不能理解:指定introducer 后的解釋,

          1. 無法類比當前所糾結的查詢的實際程序,直接的一個函式到達服務器后是如何執行的,程序中的編碼是如何轉換的,考慮查看原始碼?
      • 2.4.4 總: 與當下學習任務關聯度不大,在該問題上耗時過長,不再花費時間糾結,粗略結論:①introducer 在整個程序中沒有起到多大作用 ;
        ② convert函式可以實實在在的看到效果;
        ③單獨或一同修改(client,connection,results)并結合三者(無introducer ,有introducer, convert轉換)試驗后,效果迷離,心累,不再探究;
        ④問題關鍵還是沒有理解introducer, 各字符集,以及客戶端與服務器互動時的編碼轉換程序,日后涉及,在經驗積累的基礎上再行探究,

  2. 分類

    • 3.1 欄位級別

      • 查看某一 table 所有欄位的詳細資訊(含排序規則collation一列(根據10.3.1中的collation命名規則易知對應的character set))
        show full columns from table_name;
      • 查看當前選中的資料庫中所有表的資訊(含table_name , Engine, version , create_time , update_time, collation 等)
        show table status [ from databse_name / where name like '%name%'];
      • 修改欄位的charset 和 collation
        alter table table_name modify filed_name field_type field_charset_name;
    • 3.2 表級別

      • 查看建表陳述句(最新的,含修改過的 )( 其中包含當前表設定的默認的character set ,collation資訊)
        show create table table_name;
        da0fa5f3-fcb6-4904-b4af-f5581870e841

      • 修改表的charset和collation
        alter table table_name charset charset_name;

    • 3.3 資料庫級別

      • 查看當前資料庫默認的字符集,以及排序規則

        • show variables where variable_name = 'character_set_database'
        • use database_name;
          select @@character_set_database,@@collation_database;
        • select default_character_set_name,default_collation_name
          from information_shema.schemata
          where shcema_name = 'db_name';
          (可能這種方法涉及當前用戶的權限問題,未查證)
      • 查看建資料庫陳述句,從而了解當前資料庫默認的字符集,以及排序規則,
        show create database database_name

      • 修改資料庫的character set 和collation
        alter database database_name charset utf8mb4

    • 3.4 服務器級別

      • 查看服務器字符集配置
        show variables where variable_name = 'character_set_server ;'
        也可以簡單使用 show variables like 'char%';
      • 配置 server 的默認charset 和collation (詳細參見10.3.2節)
        • 永久性配置:修改my.ini檔案中的mysqld --character-set-server=utf8mb4 ,重啟MySQL服務,(my.ini檔案一般位于C盤 Program Files或者Programdata Files檔案夾下的mysql目錄下)
        • 暫時配置:命令列輸入:set character_set_server= utf8mb4;
        • 手冊中還介紹了cmke 命令,
    • 3.5 查看**connection , client , results ** 字符集,排序規則
      例如 : select @@character_set_connection,@@collation_connetcion;
      或者: show variables like 'char%' ;

    4.其他

    • 函式 length(),char_length(),character_length() 區別參見手冊12 章 Functions and operators ,

    • 手冊13.7節Database Adminstration Statement 的13.7.6.3 介紹了Set Names Statements.

      • set names('charset_name' [collate 'collation_name'] | default);
      • 該陳述句將三個session 系統變數 character_set_client , character_set_connection , character_set_results 同時設定為了指定的字符集 charset_name ,collate 陳述句可選,執行后可使用1.3命令查看效果,(該設定僅當次會話中有效)
      • 可以使用default值恢復默認映射,默認值取決于服務器配置
        The default mapping can be restored by using a value of DEFAULT. The default depends on the server configuration
    • 細節及注意點,查看手冊,博客set name statements總結詳細,可參考,

總結粗糙,理解不精,日后更新完善,歡迎提出見解,

轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/251620.html

標籤:MySQL

上一篇:回顧MySQL基礎

下一篇:SQL陳述句中 ` 的作用

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • GPU虛擬機創建時間深度優化

    **?桔妹導讀:**GPU虛擬機實體創建速度慢是公有云面臨的普遍問題,由于通常情況下創建虛擬機屬于低頻操作而未引起業界的重視,實際生產中還是存在對GPU實體創建時間有苛刻要求的業務場景。本文將介紹滴滴云在解決該問題時的思路、方法、并展示最終的優化成果。 從公有云服務商那里購買過虛擬主機的資深用戶,一 ......

    uj5u.com 2020-09-10 06:09:13 more
  • 可編程網卡芯片在滴滴云網路的應用實踐

    **?桔妹導讀:**隨著云規模不斷擴大以及業務層面對延遲、帶寬的要求越來越高,采用DPDK 加速網路報文處理的方式在橫向縱向擴展都出現了局限性。可編程芯片成為業界熱點。本文主要講述了可編程網卡芯片在滴滴云網路中的應用實踐,遇到的問題、帶來的收益以及開源社區貢獻。 #1. 資料中心面臨的問題 隨著滴滴 ......

    uj5u.com 2020-09-10 06:10:21 more
  • 滴滴資料通道服務演進之路

    **?桔妹導讀:**滴滴資料通道引擎承載著全公司的資料同步,為下游實時和離線場景提供了必不可少的源資料。隨著任務量的不斷增加,資料通道的整體架構也隨之發生改變。本文介紹了滴滴資料通道的發展歷程,遇到的問題以及今后的規劃。 #1. 背景 資料,對于任何一家互聯網公司來說都是非常重要的資產,公司的大資料 ......

    uj5u.com 2020-09-10 06:11:05 more
  • 滴滴AI Labs斬獲國際機器翻譯大賽中譯英方向世界第三

    **桔妹導讀:**深耕人工智能領域,致力于探索AI讓出行更美好的滴滴AI Labs再次斬獲國際大獎,這次獲獎的專案是什么呢?一起來看看詳細報道吧! 近日,由國際計算語言學協會ACL(The Association for Computational Linguistics)舉辦的世界最具影響力的機器 ......

    uj5u.com 2020-09-10 06:11:29 more
  • MPP (Massively Parallel Processing)大規模并行處理

    1、什么是mpp? MPP (Massively Parallel Processing),即大規模并行處理,在資料庫非共享集群中,每個節點都有獨立的磁盤存盤系統和記憶體系統,業務資料根據資料庫模型和應用特點劃分到各個節點上,每臺資料節點通過專用網路或者商業通用網路互相連接,彼此協同計算,作為整體提供 ......

    uj5u.com 2020-09-10 06:11:41 more
  • 滴滴資料倉庫指標體系建設實踐

    **桔妹導讀:**指標體系是什么?如何使用OSM模型和AARRR模型搭建指標體系?如何統一流程、規范化、工具化管理指標體系?本文會對建設的方法論結合滴滴資料指標體系建設實踐進行解答分析。 #1. 什么是指標體系 ##1.1 指標體系定義 指標體系是將零散單點的具有相互聯系的指標,系統化的組織起來,通 ......

    uj5u.com 2020-09-10 06:12:52 more
  • 單表千萬行資料庫 LIKE 搜索優化手記

    我們經常在資料庫中使用 LIKE 運算子來完成對資料的模糊搜索,LIKE 運算子用于在 WHERE 子句中搜索列中的指定模式。 如果需要查找客戶表中所有姓氏是“張”的資料,可以使用下面的 SQL 陳述句: SELECT * FROM Customer WHERE Name LIKE '張%' 如果需要 ......

    uj5u.com 2020-09-10 06:13:25 more
  • 滴滴Ceph分布式存盤系統優化之鎖優化

    **桔妹導讀:**Ceph是國際知名的開源分布式存盤系統,在工業界和學術界都有著重要的影響。Ceph的架構和演算法設計發表在國際系統領域頂級會議OSDI、SOSP、SC等上。Ceph社區得到Red Hat、SUSE、Intel等大公司的大力支持。Ceph是國際云計算領域應用最廣泛的開源分布式存盤系統, ......

    uj5u.com 2020-09-10 06:14:51 more
  • es~通過ElasticsearchTemplate進行聚合~嵌套聚合

    之前寫過《es~通過ElasticsearchTemplate進行聚合操作》的文章,這一次主要寫一個嵌套的聚合,例如先對sex集合,再對desc聚合,最后再對age求和,共三層嵌套。 Aggregations的部分特性類似于SQL語言中的group by,avg,sum等函式,Aggregation ......

    uj5u.com 2020-09-10 06:14:59 more
  • 爬蟲日志監控 -- Elastc Stack(ELK)部署

    傻瓜式部署,只需替換IP與用戶 導讀: 現ELK四大組件分別為:Elasticsearch(核心)、logstash(處理)、filebeat(采集)、kibana(可視化) 下載均在https://www.elastic.co/cn/downloads/下tar包,各組件版本最好一致,配合fdm會 ......

    uj5u.com 2020-09-10 06:15:05 more
最新发布
  • day02-2-商鋪查詢快取

    功能02-商鋪查詢快取 3.商鋪詳情快取查詢 3.1什么是快取? 快取就是資料交換的緩沖區(稱作Cache),是存盤資料的臨時地方,一般讀寫性能較高。 快取的作用: 降低后端負載 提高讀寫效率,降低回應時間 快取的成本: 資料一致性成本 代碼維護成本 運維成本 3.2需求說明 如下,當我們點擊商店詳 ......

    uj5u.com 2023-04-20 08:33:24 more
  • MySQL中binlog備份腳本分享

    關于MySQL的二進制日志(binlog),我們都知道二進制日志(binlog)非常重要,尤其當你需要point to point災難恢復的時侯,所以我們要對其進行備份。關于二進制日志(binlog)的備份,可以基于flush logs方式先切換binlog,然后拷貝&壓縮到到遠程服務器或本地服務器 ......

    uj5u.com 2023-04-20 08:28:06 more
  • day02-短信登錄

    功能實作02 2.功能01-短信登錄 2.1基于Session實作登錄 2.1.1思路分析 2.1.2代碼實作 2.1.2.1發送短信驗證碼 發送短信驗證碼: 發送驗證碼的介面為:http://127.0.0.1:8080/api/user/code?phone=xxxxx<手機號> 請求方式:PO ......

    uj5u.com 2023-04-20 08:27:27 more
  • 快取與資料庫雙寫一致性幾種策略分析

    本文將對幾種快取與資料庫保證資料一致性的使用方式進行分析。為保證高并發性能,以下分析場景不考慮執行的原子性及加鎖等強一致性要求的場景,僅追求最終一致性。 ......

    uj5u.com 2023-04-20 08:26:48 more
  • sql陳述句優化

    問題查找及措施 問題查找 需要找到具體的代碼,對其進行一對一優化,而非一直把關注點放在服務器和sql平臺 降低簡化每個事務中處理的問題,盡量不要讓一個事務拖太長的時間 例如檔案上傳時,應將檔案上傳這一步放在事務外面 微軟建議 4.啟動sql定時執行計劃 怎么啟動sqlserver代理服務-百度經驗 ......

    uj5u.com 2023-04-20 08:26:35 more
  • 云時代,MySQL到ClickHouse資料同步產品對比推薦

    ClickHouse 在執行分析查詢時的速度優勢很好的彌補了MySQL的不足,但是對于很多開發者和DBA來說,如何將MySQL穩定、高效、簡單的同步到 ClickHouse 卻很困難。本文對比了 NineData、MaterializeMySQL(ClickHouse自帶)、Bifrost 三款產品... ......

    uj5u.com 2023-04-20 08:26:29 more
  • sql陳述句優化

    問題查找及措施 問題查找 需要找到具體的代碼,對其進行一對一優化,而非一直把關注點放在服務器和sql平臺 降低簡化每個事務中處理的問題,盡量不要讓一個事務拖太長的時間 例如檔案上傳時,應將檔案上傳這一步放在事務外面 微軟建議 4.啟動sql定時執行計劃 怎么啟動sqlserver代理服務-百度經驗 ......

    uj5u.com 2023-04-20 08:25:13 more
  • Redis 報”OutOfDirectMemoryError“(堆外記憶體溢位)

    Redis 報錯“OutOfDirectMemoryError(堆外記憶體溢位) ”問題如下: 一、報錯資訊: 使用 Redis 的業務介面 ,產生 OutOfDirectMemoryError(堆外記憶體溢位),如圖: 格式化后的報錯資訊: { "timestamp": "2023-04-17 22: ......

    uj5u.com 2023-04-20 08:24:54 more
  • day02-2-商鋪查詢快取

    功能02-商鋪查詢快取 3.商鋪詳情快取查詢 3.1什么是快取? 快取就是資料交換的緩沖區(稱作Cache),是存盤資料的臨時地方,一般讀寫性能較高。 快取的作用: 降低后端負載 提高讀寫效率,降低回應時間 快取的成本: 資料一致性成本 代碼維護成本 運維成本 3.2需求說明 如下,當我們點擊商店詳 ......

    uj5u.com 2023-04-20 08:24:03 more
  • day02-短信登錄

    功能實作02 2.功能01-短信登錄 2.1基于Session實作登錄 2.1.1思路分析 2.1.2代碼實作 2.1.2.1發送短信驗證碼 發送短信驗證碼: 發送驗證碼的介面為:http://127.0.0.1:8080/api/user/code?phone=xxxxx<手機號> 請求方式:PO ......

    uj5u.com 2023-04-20 08:23:11 more