前言
筆者最近有一個需求,需要將一段文字插入到備注欄位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
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/547409.html
標籤:其他
