前言 筆者最近有一個需求,需要將一段文字插入到備註欄位remark前面。 由於擔心插入後超過欄位長度的限制,所以需要統計線上數據,根據長度倒序查詢remark最長的一批數據看看長度。 剛開始百度了一下 MySQL如何查看欄位長度,看到了length(),於是就寫了這條sql: select leng ...
前言
筆者最近有一個需求,需要將一段文字插入到備註欄位remark
前面。
由於擔心插入後超過欄位長度的限制,所以需要統計線上數據,根據長度倒序查詢remark
最長的一批數據看看長度。
剛開始百度了一下 MySQL如何查看欄位長度,看到了length(),於是就寫了這條sql:
select length(remark) from t_card order by length(remark) desc limit 10;
這個欄位類型是varchar(512)
,而查出來的10條數據基本都大於512,給我整懵了,當時就懷疑這個函數返回的不是字元數量,於是決定探究一下MySQL如何獲取字元串長度。
官方文檔
既然網上答案參差不齊,不如就去找找權威的官方文檔。
進入MySQL文檔首頁 https://dev.mysql.com/doc/ ,選擇下方的參考手冊,根據版本筆者選擇了MySQL 5.7 Reference Manual
。
進入手冊後,因為我們要查詢字元串的函數,所以左側目錄選擇String Functions and Operators
。
跳轉後可以看到一個函數表格,包括了接近60個字元串函數,我們需要查詢字元串長度的函數,使用CTRL + F
查找關鍵詞length
,大致篩選出以下5個函數:
函數名 | 解釋原文 | 翻譯 |
---|---|---|
BIT_LENGTH() | Return length of argument in bits | 返回參數的bit數 |
CHAR_LENGTH() | Return number of characters in argument | 返回參數中的字元數 |
CHARACTER_LENGTH() | Synonym for CHAR_LENGTH() | CHAR_LENGTH()的同義詞 |
LENGTH() | Return the length of a string in bytes | 返回字元串的長度(以位元組為單位) |
OCTET_LENGTH() | Synonym for LENGTH() | LENGTH()的同義詞 |
我們可以看到這些函數返回值的單位有bit、位元組、字元數,弄清楚單位之間的轉換關係就能更好的理解查詢結果的含義。
我們知道位元組是電腦最小的存儲單位,1位元組等於8 bit,那麼存儲1個字元需要用到多少位元組呢?這個和使用的編碼集有關,查詢手冊https://dev.mysql.com/doc/refman/5.7/en/charset-unicode.html
,以我們最常用的UTF-8
為例:
- 字母、數字和標點符號:1位元組
- 大多數歐洲和中東文字:2位元組
- 韓語、中文和日語文字:3位元組或4位元組
看到這裡,最開始的疑惑就能解開了,varchar
設置的是字元數量,而筆者sql中使用的是LENGTH()
,查詢的是字元串的位元組數,而備註基本都是中文,結果就大概是字元數的兩到三倍。
結論
筆者的核心需求是獲取字元串長度,所以這裡應該使用CHAR_LENGTH()
或者同義函數CHARACTER_LENGTH()
。
後語
本文通過查閱官方文檔解決一個簡單的MySQL問題,旨在記錄和鞭策自身建立一種健康的學習方式,主動探究問題,而不只是簡單地獲取他人的解決方案。
本文來自博客園,作者:冰兀朮,轉載請註明原文鏈接:https://www.cnblogs.com/gxy2825/p/17195708.html