跟我一起学习MySQL技术内幕(第五版):(第三章学习日记2上)
3.1.2字符串值 3.1.2.1字符串类型与字符集支持 3.1.2.2字符集相关的系统变量 3.1.2.1字符串类型与字符集支持 字符串值一般可以分为两类,二进制串和非二进制串 二进制串:一组字节序列,没有特殊的比较或者排序属性. 比较操作是基于各字节的数值逐个字节实现的.
3.1.2字符串值
3.1.2.1字符串类型与字符集支持
3.1.2.2字符集相关的系统变量
3.1.2.1字符串类型与字符集支持
字符串值一般可以分为两类,二进制串和非二进制串
<code> 二进制串:一组字节序列,没有特殊的比较或者排序属性. 比较操作是基于各字节的数值逐个字节实现的. 所有字节都有意义,**甚至包括结尾的空格**. 非二进制串:一个字符序列,每个二进制串都与字符集相关. 字符集决定了:MySQL如何解释字符串内容,哪些字符可以用. 每个字符集都有一种或者多种排序规则. **尾部空格不会参与比较(TEXT类型除外-具有唯一性索引)** </code>
字符串所使用的排序规则决定了字符在字符集里的先后顺序,这会对比较操作产生影响.
默认的字符集和排序规则分别为latin1和latin_swedish_ci.
查看服务器上提供的字符集以及排序规则:
<code class=" hljs smalltalk">show character set; +----------+-----------------------------+---------------------+--------+ | <span class="hljs-class">Charset</span> | <span class="hljs-class">Description</span> | <span class="hljs-class">Default</span> collation | <span class="hljs-class">Maxlen</span> | +----------+-----------------------------+---------------------+--------+ <span class="hljs-localvars">| big5 |</span> <span class="hljs-class">Big5</span> <span class="hljs-class">Traditional</span> <span class="hljs-class">Chinese</span> <span class="hljs-localvars">| big5_chinese_ci |</span> <span class="hljs-number">2</span> | <span class="hljs-localvars">| dec8 |</span> <span class="hljs-class">DEC</span> <span class="hljs-class">West</span> <span class="hljs-class">European</span> <span class="hljs-localvars">| dec8_swedish_ci |</span> <span class="hljs-number">1</span> | <span class="hljs-localvars">| cp850 |</span> <span class="hljs-class">DOS</span> <span class="hljs-class">West</span> <span class="hljs-class">European</span> <span class="hljs-localvars">| cp850_general_ci |</span> <span class="hljs-number">1</span> | <span class="hljs-localvars">| hp8 |</span> <span class="hljs-class">HP</span> <span class="hljs-class">West</span> <span class="hljs-class">European</span> <span class="hljs-localvars">| hp8_english_ci |</span> <span class="hljs-number">1</span> | <span class="hljs-localvars">| koi8r |</span> <span class="hljs-class">KOI8</span>-<span class="hljs-class">R</span> <span class="hljs-class">Relcom</span> <span class="hljs-class">Russian</span> <span class="hljs-localvars">| koi8r_general_ci |</span> <span class="hljs-number">1</span> | ....... ....... show collation; --------------------------+----------+-----+---------+----------+---------+ | <span class="hljs-class">Collation</span> | <span class="hljs-class">Charset</span> | <span class="hljs-class">Id</span> | <span class="hljs-class">Default</span> | <span class="hljs-class">Compiled</span> | <span class="hljs-class">Sortlen</span> | +--------------------------+----------+-----+---------+----------+---------+ <span class="hljs-localvars">| big5_chinese_ci | big5 |</span> <span class="hljs-number">1</span> | <span class="hljs-class">Yes</span> | <span class="hljs-class">Yes</span> | <span class="hljs-number">1</span> | <span class="hljs-localvars">| big5_bin | big5 |</span> <span class="hljs-number">84</span> | | <span class="hljs-class">Yes</span> | <span class="hljs-number">1</span> | <span class="hljs-localvars">| dec8_swedish_ci | dec8 |</span> <span class="hljs-number">3</span> | <span class="hljs-class">Yes</span> | <span class="hljs-class">Yes</span> | <span class="hljs-number">1</span> | <span class="hljs-localvars">| dec8_bin | dec8 |</span> <span class="hljs-number">69</span> | | <span class="hljs-class">Yes</span> | <span class="hljs-number">1</span> | <span class="hljs-localvars">| cp850_general_ci | cp850 |</span> <span class="hljs-number">4</span> | <span class="hljs-class">Yes</span> | <span class="hljs-class">Yes</span> | <span class="hljs-number">1</span> | <span class="hljs-localvars">| cp850_bin | cp850 |</span> <span class="hljs-number">80</span> | | <span class="hljs-class">Yes</span> | <span class="hljs-number">1</span> | ........ ........</code>
每种排序规则都捆绑在某个特定的字符集上,而每个给定的字符集可以有多种排序规则.
格式: 字符集名语言名附加后缀
后缀规则如下:
_ci表示排序规则不区分大小写
_cs表示排序规则要区分大小写
_bin表示这是一种二进制排序规则.(比较操作基于数字字符编码值进行,与语言无关)
如:utf8_bin
二进制串和非二进制串的排序特性:
二: 逐字节进行比较,结果只取决于每个字节的数值大小,区分大小写(大小写不同,对应
字节数值不同,二进制串其实并没有大小写的概念区分大小写实际上是排序规则的一项功能)
非二:按字符进行比较,每一个字符的相对值取决于当前所用字符集的排序规则.大小写设定为同一排序值,所以不区分大小写(不适用于区分大小写的非二进制排序)
确定某个字符串的字符集和排序规则:
(默认情况下,MySQL会把十六进制常量当作二进制串对待)
<code class=" hljs asciidoc">select charset(x'0123'),collation(x'0123'); <span class="hljs-code">+------------------+</span>--------------------+ <span class="hljs-header">| charset(x'0123') | collation(x'0123') | +------------------+--------------------+</span> <span class="hljs-header">| binary | binary | +------------------+--------------------+</span> </code>
有两种记法约定可以用于将某个字符串强制解释为某种指定的字符集.
1._charset str
<code class=" hljs bash">_latin2 <span class="hljs-string">'abc'</span> _latin2 x<span class="hljs-string">'616263'</span> _latin2 <span class="hljs-number">0</span>x616263 _utf8 <span class="hljs-string">'def'</span> _utf8 X<span class="hljs-string">'646566'</span> _utf8 <span class="hljs-number">0</span>x646566</code>
<code>对于引号里的字符串: 字符集引导符与字符串之间空白可选 十六进制不能留有任何空白 </code>
2.N’str’(等价于_utf8’str’)
N的后面必须紧跟一个引号形式的字符串,不能有任何空白
(3.对于字符串表达式或列值的引导符记法)
<code class=" hljs cs">convert (str <span class="hljs-keyword">using</span> charset);</code>
引导符和convert是不一样的,引导符只会改变对字符串的解释,不会改变值,而convert是一个函数,进入的是输入参数,生成一个新的字符串返回.
<code class=" hljs asciidoc">set @s1 = <span class="hljs-emphasis">_ucs2 'ABCD'; set @s2 = convert ('ABCD' using ucs2); select char_</span>length(@s1), length(@s1), char<span class="hljs-emphasis">_length(@s2), length(@s2); </span> <span class="hljs-code">+------------------+</span>-------------<span class="hljs-code">+------------------+</span>-------------+ <span class="hljs-header">| char_length(@s1) | length(@s1) | char_length(@s2) | length(@s2) | +------------------+-------------+------------------+-------------+</span> <span class="hljs-header">| 2 | 4 | 4 | 8 | +------------------+-------------+------------------+-------------+</span> </code>
第一条语句:把ABCD每一对字符解释为一个双字节ucs2字符
第二条语句:把每个字符转化为相应的ucs2字符.
这一节最后介绍了二进制串与使用二进制串排序规则的非二进制串的区别.
1.二进制串没有字符集的概念.它会被解释为字节,并且比较的是单字节的数字代码
2.使用了二进制排序规则的非二进制串,会被解释为字符,并且比较的是它们的数字字符值,这种值通常是基于每个字符多个字节算出的.
<code class=" hljs asciidoc">set @s1 = binary <span class="hljs-emphasis">'abcd'</span>; set @s2 = <span class="hljs-emphasis">_latin1'abcd' collate latin1_</span>bin; select upper(@s1),upper(@s2); <span class="hljs-code">+------------+</span>------------+ <span class="hljs-header">| upper(@s1) | upper(@s2) | +------------+------------+</span> <span class="hljs-header">| abcd | ABCD | +------------+------------+</span></code>
二进制串根本没有字符集的概念,所以无从得知哪些字节值对应着大写或者小写字符.如果非要这么做,可以选择先 convert再使用upper lower函数.
3.1.2.2字符集相关的系统变量
<code>这一小节pass 暂时并没有什么用 一切使用默认就好了 </code>

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

熱門話題

MySQL是一個開源的關係型數據庫管理系統。 1)創建數據庫和表:使用CREATEDATABASE和CREATETABLE命令。 2)基本操作:INSERT、UPDATE、DELETE和SELECT。 3)高級操作:JOIN、子查詢和事務處理。 4)調試技巧:檢查語法、數據類型和權限。 5)優化建議:使用索引、避免SELECT*和使用事務。

可以通過以下步驟打開 phpMyAdmin:1. 登錄網站控制面板;2. 找到並點擊 phpMyAdmin 圖標;3. 輸入 MySQL 憑據;4. 點擊 "登錄"。

MySQL是一種開源的關係型數據庫管理系統,主要用於快速、可靠地存儲和檢索數據。其工作原理包括客戶端請求、查詢解析、執行查詢和返回結果。使用示例包括創建表、插入和查詢數據,以及高級功能如JOIN操作。常見錯誤涉及SQL語法、數據類型和權限問題,優化建議包括使用索引、優化查詢和分錶分區。

選擇MySQL的原因是其性能、可靠性、易用性和社區支持。 1.MySQL提供高效的數據存儲和檢索功能,支持多種數據類型和高級查詢操作。 2.採用客戶端-服務器架構和多種存儲引擎,支持事務和查詢優化。 3.易於使用,支持多種操作系統和編程語言。 4.擁有強大的社區支持,提供豐富的資源和解決方案。

Redis 使用單線程架構,以提供高性能、簡單性和一致性。它利用 I/O 多路復用、事件循環、非阻塞 I/O 和共享內存來提高並發性,但同時存在並發性受限、單點故障和不適合寫密集型工作負載的局限性。

MySQL和SQL是開發者必備技能。 1.MySQL是開源的關係型數據庫管理系統,SQL是用於管理和操作數據庫的標準語言。 2.MySQL通過高效的數據存儲和檢索功能支持多種存儲引擎,SQL通過簡單語句完成複雜數據操作。 3.使用示例包括基本查詢和高級查詢,如按條件過濾和排序。 4.常見錯誤包括語法錯誤和性能問題,可通過檢查SQL語句和使用EXPLAIN命令優化。 5.性能優化技巧包括使用索引、避免全表掃描、優化JOIN操作和提升代碼可讀性。

MySQL在數據庫和編程中的地位非常重要,它是一個開源的關係型數據庫管理系統,廣泛應用於各種應用場景。 1)MySQL提供高效的數據存儲、組織和檢索功能,支持Web、移動和企業級系統。 2)它使用客戶端-服務器架構,支持多種存儲引擎和索引優化。 3)基本用法包括創建表和插入數據,高級用法涉及多表JOIN和復雜查詢。 4)常見問題如SQL語法錯誤和性能問題可以通過EXPLAIN命令和慢查詢日誌調試。 5)性能優化方法包括合理使用索引、優化查詢和使用緩存,最佳實踐包括使用事務和PreparedStatemen

直接從數據庫中恢復被刪除的行通常是不可能的,除非有備份或事務回滾機制。關鍵點:事務回滾:在事務未提交前執行ROLLBACK可恢復數據。備份:定期備份數據庫可用於快速恢復數據。數據庫快照:可創建數據庫只讀副本,在數據誤刪後恢復數據。慎用DELETE語句:仔細檢查條件,避免誤刪數據。使用WHERE子句:明確指定要刪除的數據。使用測試環境:在執行DELETE操作前進行測試。
