記一次mysql字符串末尾空白丟失的排查
問題背景
一天,小伙伴找到我,他說他碰到一個很奇怪的問題
他說:明明表名的入?yún)⑹?nbsp;test ,為什么展示到界面的記錄包括 test 這條記錄?
他補充道:會不會是 MyBatis-Plus 做了什么騷操作,把 test 末尾的空格給拿掉了
我:你直接把 SQL 語句到 MySQL 執(zhí)行下試試
結果如下:

這看起來不夠直觀,我移動下光標

然后我和小伙伴面面相覷

環(huán)境準備
MySQL5 、 MySQL8 各準備一個


我們來看下默認情況下,末尾空白的判斷情況
MySQL 5.7.36 如下

1 表示 TRUE ,也就是相等
MySQL 8.0.27 如下

0 表示 FALSE ,表示不相等
這是什么原因,我們繼續(xù)往下看
字符集與字符序
比較肯定就需要比較規(guī)則, SQL 的比較規(guī)則就離不開字符序,字符序又與字符集相關,所以我們一個一個來捋
字符集
關于字符集,不是只言片語可以說清楚的,但是大家也不用擔心,網(wǎng)上相關資料已經(jīng)非常多,大家擦亮慧眼去查閱即可
簡單點來說:字符集定義了字符和字符的編碼
有人又問了:字符、字符的編碼又是什么?

為了方便大家理解,舉個簡單栗子
有四個字符:A、B、C、D,這四個字符的編碼分別是 A = 0, B = 1, C = 2, D = 3
這里的字符(A、B、C、D) + 編碼(0、1、2、3)就構成了字符集(character set)
MySQL 支持的字符集有很多,可以通過 SHOW CHARACTER SET; 查看

Charset :字符集名
Description :描述
Default collation :默認字符序
Maxlen :每個字符最多字節(jié)數(shù)
字符序
定義了字符的比較規(guī)則;字符間的比較按何種規(guī)則進行
一個字符集對應多個字符序,通過 SHOW COLLATION; 可以查看全部的字符序;也可以帶條件查具體某個字符集的字符序

Default 等于 Yes 表示是默認字符序
每個字符集都有默認的字符序
server的字符集與字符序
當我們創(chuàng)建數(shù)據(jù)庫時,沒有指定字符集、字符序,那么server字符集、server字符序就會作為該數(shù)據(jù)庫的字符集、字符序

database的字符集與字符序
指定數(shù)據(jù)庫級別的字符集、字符序
同一個MySQL服務下的數(shù)據(jù)庫,可以分別指定不同的字符集、字符序
創(chuàng)建、修改數(shù)據(jù)庫的時候,可以通過 CHARACTER SET 、 COLLATE 指定數(shù)據(jù)庫的字符集、字符序

可以通過

查看數(shù)據(jù)庫的字符集和字符序
table的字符集與字符序
創(chuàng)建、修改表的時候,可以通過 CHARACTER SET 、 COLLATE 指定表的字符集、字符序

可以通過

查看表的字符序
column的字符集與字符序
類型為 CHAR 、 VARCHAR 、 TEXT 的列,可以指定字符集、字符序

可以通過

查看字段的字符集和字符序
多個維度指定字符集、字符序的話,粒度越細的優(yōu)先級越高( column > table > database > server )
如果細粒度未指定字符集、字符序,那么會繼承上一級的字符集,字符序則是上一級字符集的默認字符序
通常情況下我們一般不會指定 table 、 column 粒度的字符集、字符序
也就是說,通常情況下 column 的字符集會與 database 的字符集一致,而 column 的字符序則是 database 字符集的默認字符序
空白丟失
上面講了那么多,跟空白丟失有什么關系?
大家先莫急,繼續(xù)往下看
MySQL5.7 The CHAR and VARCHAR Types中有這么一段

翻譯過來就是:
1、類型是 CHAR 、 VARCHAR 、 TEXT 列的值,會根據(jù)列的字符序來比較和排序
2、所有 MySQL 排序規(guī)則的類型都是 PAD SPACE 。這就意味著, CHAR 、 VARCHAR 、 TEXT 類型的值進行比較時,不用考慮任何末尾空格,LIKE 除外
3、不受 SQL mode 影響,也就是說不管是嚴格模式,還是非嚴格模式,都不影響 2 所說的規(guī)則
劃重點,記筆記:在 MySQL5.7 及以下( <=5.7 )版本中,排序規(guī)則都是 PAD SPACE ,末尾的空格會忽略不考慮
那如何讓末尾空格參與比較了,有三種處理方式
1、 BINARY ,類似 SELECT 'test' = BINARY 'test ';

2、 LIKE ,類似 SELECT 'test' LIKE 'test ';

3、 LENGTH 函數(shù),類似

MySQL8 做了調整,The CHAR and VARCHAR Types 有如下說明

翻譯過來就是:
1、類型是 CHAR 、 VARCHAR 、 TEXT 列的值,會根據(jù)列的字符序來比較和排序
2、 MySQL 字符序的 pad 參數(shù)的可選值,除了 PAD SPACE ,還增加了 NO PAD

3、對于非二進制字符串( CHAR 、 VARCHAR 、 TEXT ),字符序 pad 參數(shù)決定如何去處理字符串末尾的空格
NO PAD 不會忽略末尾空格,會將其當做其他字符一樣對待
PAD SPACE 會忽略末尾空格, LIKE 除外
SQL mode 不參與字符串末尾空格的處理
MySQL8 server 維度的字符集是 utf8mb4 ,對應的默認字符序是: utf8mb4_0900_ai_ci


Pad_attribute 的值是 NO PAD ,也就是不會忽略字符串末尾的空格
所以在 MySQL8 中, SELECT 'test' = 'test '; 默認情況下得到的結果是 0
總結
1、非二進制字符串( CHAR 、 VARCHAR 、 TEXT )比較時,末尾空格的處理跟列的字符序有直接關系
2、 MySQL5.7 及之前的版本,排序規(guī)則的類型都是 PAD SPACE ,會忽略字符串末尾的空格, LIKE 除外
3、 MySQL8 開始,字符序增加了一個參數(shù) Pad_attribute ,該參數(shù)的值不同,對字符串末尾空格的處理方式不同
NO PAD :字符串末尾的空格會和其他字符一樣,不會被忽略
PAD SPACE :字符串末尾的空格會被忽略, LIKE 除外
4、如上針對的都是非二進制字符串的排序和比較,而不是儲存
參考
到此這篇關于記一次mysql字符串末尾空白丟失的排查的文章就介紹到這了,更多相關mysql字符串末尾空白丟失的排查內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
mysql執(zhí)行腳本導入表和數(shù)據(jù)后中文注釋亂碼的問題解決
本人在使用不同版本下進行操作時,就會出現(xiàn)中文亂碼的問題,,例如我本地安裝mysql8,服務器安裝的是mysql5,然后本地連接服務器的mysql后,執(zhí)行SQL腳本之后發(fā)現(xiàn)中文全部亂碼,所以本文介紹了mysql執(zhí)行腳本導入表和數(shù)據(jù)后中文注釋亂碼的問題解決,需要的朋友可以參考下2024-04-04
如何利用MySQL的binlog恢復誤刪數(shù)據(jù)庫詳解
MySQL一旦誤刪數(shù)據(jù)庫之后恢復數(shù)據(jù)很麻煩,這里記錄一下艱辛的恢復過程,這篇文章主要給大家介紹了關于如何利用MySQL的binlog恢復誤刪數(shù)據(jù)庫的相關資料,需要的朋友可以參考下2021-09-09
Windows下MySQL5.6查找my.ini配置文件的方法
今天小編就為大家分享一篇Windows下MySQL5.6查找my.ini配置文件的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-06-06
解決Access denied for user root @&nbs
這篇文章給大家介紹了解決:Access denied for user ‘root‘@‘192.168.120.1‘ (using password: YES)的問題,文中通過圖文和代碼給大家分析的非常詳細,具有一定的參考價值,需要的朋友可以參考下2024-01-01
mysql創(chuàng)建Bitmap_Join_Indexes中的約束與索引
現(xiàn)象:創(chuàng)建Bitmap Join Indexes時出現(xiàn)ORA-25954報錯: 維的主鍵或唯一約束條件缺失。 53vi.Com 原因:受到約束與索引的影響。2008-04-04
MySQL排序機制之獲取最后10條數(shù)據(jù)的正確方法
在日志分析、最新數(shù)據(jù)展示等場景中,我們常需獲取排序后的最后N條數(shù)據(jù),傳統(tǒng)思維認為直接使用ORDER BY ... DESC LIMIT N即可,但實測發(fā)現(xiàn)這種寫法在大數(shù)據(jù)量下性能驟降,本文將深入解析MySQL排序機制,揭秘高效獲取最后10條數(shù)據(jù)的科學方法,需要的朋友可以參考下2026-02-02
Ubuntu 20.04 安裝和配置MySql5.7的詳細教程
這篇文章主要介紹了Ubuntu 20.04 安裝和配置MySql5.7的相關資料,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-12-12

