MySQL數(shù)據(jù)庫怎么正確查詢字符串長度
前言
筆者最近有一個(gè)需求,需要將一段文字插入到備注字段remark前面。
由于擔(dān)心插入后超過字段長度的限制,所以需要統(tǒng)計(jì)線上數(shù)據(jù),根據(jù)長度倒序查詢remark最長的一批數(shù)據(jù)看看長度。
剛開始百度了一下 MySQL如何查看字段長度,看到了length(),于是就寫了這條sql:
select length(remark) from t_card order by length(remark) desc limit 10;
這個(gè)字段類型是varchar(512),而查出來的10條數(shù)據(jù)基本都大于512,給我整懵了,當(dāng)時(shí)就懷疑這個(gè)函數(shù)返回的不是字符數(shù)量,于是決定探究一下MySQL如何獲取字符串長度。
官方文檔
既然網(wǎng)上答案參差不齊,不如就去找找權(quán)威的官方文檔。
進(jìn)入MySQL文檔首頁 https://dev.mysql.com/doc/ ,選擇下方的參考手冊,根據(jù)版本筆者選擇了MySQL 5.7 Reference Manual。

進(jìn)入手冊后,因?yàn)槲覀円樵冏址暮瘮?shù),所以左側(cè)目錄選擇String Functions and Operators。

跳轉(zhuǎn)后可以看到一個(gè)函數(shù)表格,包括了接近60個(gè)字符串函數(shù),我們需要查詢字符串長度的函數(shù),使用CTRL + F查找關(guān)鍵詞length,大致篩選出以下5個(gè)函數(shù):
| 函數(shù)名 | 解釋原文 | 翻譯 |
|---|---|---|
| BIT_LENGTH() | Return length of argument in bits | 返回參數(shù)的bit數(shù) |
| CHAR_LENGTH() | Return number of characters in argument | 返回參數(shù)中的字符數(shù) |
| CHARACTER_LENGTH() | Synonym for CHAR_LENGTH() | CHAR_LENGTH()的同義詞 |
| LENGTH() | Return the length of a string in bytes | 返回字符串的長度(以字節(jié)為單位) |
| OCTET_LENGTH() | Synonym for LENGTH() | LENGTH()的同義詞 |
我們可以看到這些函數(shù)返回值的單位有bit、字節(jié)、字符數(shù),弄清楚單位之間的轉(zhuǎn)換關(guān)系就能更好的理解查詢結(jié)果的含義。
我們知道字節(jié)是計(jì)算機(jī)最小的存儲(chǔ)單位,1字節(jié)等于8 bit,那么存儲(chǔ)1個(gè)字符需要用到多少字節(jié)呢?這個(gè)和使用的編碼集有關(guān),查詢手冊https://dev.mysql.com/doc/refman/5.7/en/charset-unicode.html,以我們最常用的UTF-8為例:
- 字母、數(shù)字和標(biāo)點(diǎn)符號(hào):1字節(jié)
- 大多數(shù)歐洲和中東文字:2字節(jié)
- 韓語、中文和日語文字:3字節(jié)或4字節(jié)
看到這里,最開始的疑惑就能解開了,varchar設(shè)置的是字符數(shù)量,而筆者sql中使用的是LENGTH(),查詢的是字符串的字節(jié)數(shù),而備注基本都是中文,結(jié)果就大概是字符數(shù)的兩到三倍。
結(jié)論
筆者的核心需求是獲取字符串長度,所以這里應(yīng)該使用CHAR_LENGTH() 或者同義函數(shù)CHARACTER_LENGTH()。
附:MySQL SELECT語句查詢字符串長度大于、小于或等于指定值
在MySQL中查詢字符串長度使用length關(guān)鍵字,具體用法如下:
查詢某字段長度大于10的記錄:
select * from tablename where length(字段名)>10
查詢某字段長度小于或等于5的記錄:
select * from tablename where length(字段名) <= 5
后語
本文通過查閱官方文檔解決一個(gè)簡單的MySQL問題,旨在記錄和鞭策自身建立一種健康的學(xué)習(xí)方式,主動(dòng)探究問題,而不只是簡單地獲取他人的解決方案。
到此這篇關(guān)于MySQL數(shù)據(jù)庫怎么正確查詢字符串長度的文章就介紹到這了,更多相關(guān)MySQL查詢字符串長度內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
mysql創(chuàng)建函數(shù)出現(xiàn)1418錯(cuò)誤的解決辦法
本篇文章是對在Mysql中創(chuàng)建函數(shù)報(bào)“ERROR 1418”的解決方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-06-06
MySql數(shù)據(jù)庫單表查詢與多表連接查詢效率對比
在遇到數(shù)據(jù)之間的聯(lián)系很復(fù)雜,建表就很糾結(jié),到底該怎么去處理這些復(fù)雜的數(shù)據(jù)呢,是單表查詢,然后在業(yè)務(wù)層去處理數(shù)據(jù)間的關(guān)系,還是直接通過多表連接查詢來處理數(shù)據(jù)關(guān)系呢2021-09-09
Mysql分片,大數(shù)據(jù)量時(shí)擴(kuò)容解決方案
這篇文章主要介紹了Mysql分片,大數(shù)據(jù)量時(shí)擴(kuò)容解決方案,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-06-06
淺析centos 7 mysql-8.0.19-1.el7.x86_64.rpm-bundle.tar
這篇文章主要介紹了centos 7 mysql-8.0.19-1.el7.x86_64.rpm-bundle.tar的相關(guān)知識(shí),需要的朋友可以參考下2020-01-01
mysql截取的字符串函數(shù)substring_index的用法
這篇文章主要介紹了mysql截取的字符串函數(shù)substring_index的用法,需要的朋友可以參考下2014-08-08
MySQL庫與表的DDL核心操作實(shí)戰(zhàn)案例
本文詳細(xì)介紹了MySQL數(shù)據(jù)庫和表的創(chuàng)建、修改、備份、刪除等操作,涵蓋了字符集選擇、表結(jié)構(gòu)設(shè)計(jì)、備份恢復(fù)等核心知識(shí)點(diǎn),通過實(shí)際案例,讀者可以掌握精準(zhǔn)操作,避免數(shù)據(jù)丟失,提升開發(fā)效率,感興趣的朋友跟隨小編一起看看吧2026-03-03
MySQL數(shù)據(jù)表分區(qū)策略及優(yōu)缺點(diǎn)分析
項(xiàng)目開發(fā)中,隨著數(shù)據(jù)庫數(shù)據(jù)量越來越大,單個(gè)表中數(shù)據(jù)太多,從而導(dǎo)致查詢速度變慢,而且由于表的鎖機(jī)制導(dǎo)致應(yīng)用操作也受到嚴(yán)重影響,出現(xiàn)了數(shù)據(jù)庫性能瓶頸。因此我們需要考慮分表與分區(qū),MySQL分表分區(qū)就是為了解決大數(shù)據(jù)量導(dǎo)致MySQL性能低下的問題。2021-05-05
MySQL運(yùn)維實(shí)戰(zhàn)之使用二進(jìn)制安裝部署
這篇文章主要為大家介紹了MySQL運(yùn)維實(shí)戰(zhàn)之使用二進(jìn)制安裝部署示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-12-12

