MySQL數(shù)據(jù)庫怎么正確查詢字符串長度
前言
筆者最近有一個需求,需要將一段文字插入到備注字段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;
這個字段類型是varchar(512)
,而查出來的10條數(shù)據(jù)基本都大于512,給我整懵了,當(dāng)時就懷疑這個函數(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)后可以看到一個函數(shù)表格,包括了接近60個字符串函數(shù),我們需要查詢字符串長度的函數(shù),使用CTRL + F
查找關(guān)鍵詞length
,大致篩選出以下5個函數(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ī)最小的存儲單位,1字節(jié)等于8 bit,那么存儲1個字符需要用到多少字節(jié)呢?這個和使用的編碼集有關(guān),查詢手冊https://dev.mysql.com/doc/refman/5.7/en/charset-unicode.html
,以我們最常用的UTF-8
為例:
- 字母、數(shù)字和標(biāo)點(diǎn)符號: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
后語
本文通過查閱官方文檔解決一個簡單的MySQL問題,旨在記錄和鞭策自身建立一種健康的學(xué)習(xí)方式,主動探究問題,而不只是簡單地獲取他人的解決方案。
到此這篇關(guān)于MySQL數(shù)據(jù)庫怎么正確查詢字符串長度的文章就介紹到這了,更多相關(guān)MySQL查詢字符串長度內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
mysql優(yōu)化系列 DELETE子查詢改寫優(yōu)化
有個采用子查詢的DELETE執(zhí)行得非常慢,改寫成SELECT后執(zhí)行卻很快,最后把這個子查詢DELETE改寫成JOIN優(yōu)化過程2016-08-08MySQL?中的服務(wù)器配置和狀態(tài)詳解(MySQL?Server?Configuration?and?Statu
MySQL服務(wù)器配置和狀態(tài)設(shè)置包括服務(wù)器選項(xiàng)、系統(tǒng)變量和狀態(tài)變量三個方面,可以通過命令行、配置文件或SQL語句進(jìn)行設(shè)置和查看,服務(wù)器選項(xiàng)和系統(tǒng)變量可以是全局或會話級別的,狀態(tài)變量只讀且不可修改,sql_mode是一個特殊的變量,影響SQL語句的執(zhí)行模式,感興趣的朋友一起看看吧2025-02-02MySQL?RC事務(wù)隔離的實(shí)現(xiàn)原理
這篇文章主要介紹了MySQL?RC事務(wù)隔離的實(shí)現(xiàn),Read?Committed,事務(wù)運(yùn)行期間,只要別的事務(wù)修改數(shù)據(jù)并提交,即可讀到人家修改的數(shù)據(jù),所以會有不可重復(fù)讀、幻讀問題,下文相關(guān)介紹需要的朋友可以參考下2022-03-03MySQL根據(jù)條件遷移數(shù)據(jù)的幾種方法實(shí)現(xiàn)
本文主要介紹了MySQL根據(jù)條件遷移數(shù)據(jù)的實(shí)現(xiàn),包括使用INSERT INTO SELECT、UPDATE、DELETE語句以及結(jié)合子查詢進(jìn)行遷移,具有一定的參考價值,感興趣的可以了解一下2024-02-02解決mysql.server?start執(zhí)行報(bào)錯ERROR!The?server?quit?without?u
這篇文章主要介紹了解決mysql.server?start執(zhí)行報(bào)錯ERROR!The?server?quit?without?updating?PID?file問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-09-09結(jié)合PHP腳本添加和查詢MySQL數(shù)據(jù)的基本教程
這篇文章主要介紹了結(jié)合PHP腳本添加和查詢MySQL數(shù)據(jù)的基本教程,即在PHP程序中使用基本的SELECT FROM和INSERT INTO語句,需要的朋友可以參考下2015-12-12