首页 > 基础资料 博客日记
MySQL如何正确查询字符串长度
2023-07-24 11:46:34基础资料围观745次
前言
笔者最近有一个需求,需要将一段文字插入到备注字段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问题,旨在记录和鞭策自身建立一种健康的学习方式,主动探究问题,而不只是简单地获取他人的解决方案。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:jacktools123@163.com进行投诉反馈,一经查实,立即删除!
标签:
相关文章
最新发布
- 【开源工具分享】一款开源的高效PDF合并与图片转换工具:mergePDF,一款轻量级桌面可视化工具,支持将多个PDF文件合并为单一PDF,也可将PDF转换为图片格式,并提供“单张图片”与“长图片”两种
- 剑指offer-56、删除链表中重复的节点
- jvm~分析gc老年代内存过高的原因
- Java 哪些情况会导致内存泄漏
- Spring AOP + Guava RateLimiter:我是如何用注解实现优雅限流的?
- 回溯算法总结
- Java 操作 Markdown(1)--commonmark-java 使用
- 分库分表数据源ShardingSphereDataSource的Connection元数据误用问题分析
- jvm~jvm配置与系统配置的关系
- 使用Java Stream,将集合转换为一对一Map

