首页 > 数据库 >MySQL如何正确查询字符串长度

MySQL如何正确查询字符串长度

时间:2023-03-19 18:13:46浏览次数:50  
标签:字节 LENGTH 查询 length MySQL 字符串

前言

笔者最近有一个需求,需要将一段文字插入到备注字段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
image

进入手册后,因为我们要查询字符串的函数,所以左侧目录选择String Functions and Operators
image

跳转后可以看到一个函数表格,包括了接近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. 字母、数字和标点符号:1字节
  2. 大多数欧洲和中东文字:2字节
  3. 韩语、中文和日语文字:3字节或4字节

看到这里,最开始的疑惑就能解开了,varchar设置的是字符数量,而笔者sql中使用的是LENGTH(),查询的是字符串的字节数,而备注基本都是中文,结果就大概是字符数的两到三倍。

结论

笔者的核心需求是获取字符串长度,所以这里应该使用CHAR_LENGTH() 或者同义函数CHARACTER_LENGTH()

后语

本文通过查阅官方文档解决一个简单的MySQL问题,旨在记录和鞭策自身建立一种健康的学习方式,主动探究问题,而不只是简单地获取他人的解决方案。

标签:字节,LENGTH,查询,length,MySQL,字符串
From: https://www.cnblogs.com/gxy2825/p/17195708.html

相关文章

  • 看看这份2023年MySQL终级面试题,提升你的内力,给你面试助力
    1、MySQL中有哪几种锁?(1)表级锁:开销小,加锁快;不会出现死锁;锁定粒度大,发生锁冲突的概率最高,并发度最低。(2)行级锁:开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低......
  • 命令行查询本机公网ip地址
    有时需要本机公网ip:不论你的操作系统是否有图形界面,都能通过命令行获得公网地址.Unix,Linux,MacOS使用curl指令即可获取公网ip:    ​    ​curl cip.ccWin......
  • Java基础字符串练习
    ​定义一个方法,把int数组中的数据按照指定的格式拼接成一个字符串返回,调用该方法,并在控制台输出结果。要求:1、如果传递的参数为空,返回null2、如果传递的数组元素个数为0......
  • flask框架,查询某个目录下文件列表,目录列表,查询是否存在某个文件
    #要查询的目录directory='/path/to/directory'#获取目录下的所有文件和目录contents=os.listdir(directory)#筛选出所有的文件files=[......
  • 力扣586(MySQL)-订单最多的客户(简单)
    题目:编写一个SQL查询,为下了最多订单的客户查找customer_number。测试用例生成后,恰好有一个客户比任何其他客户下了更多的订单。查询结果格式如下所示。 进阶......
  • 【MyBatis框架】查询缓存-一级缓存原理
    查询缓存1.什么是查询缓存mybatis提供查询缓存,用于减轻数据压力,提高数据库性能。mybaits提供一级缓存,和二级缓存。缓存模式图如图一级缓存是......
  • 【MyBatis框架】高级映射-多对多查询
    多对多查询1.需求查询用户及用户购买商品信息。2.sql语句查询主表是:用户表关联表:由于用户和商品没有直接关联,通过订单和订单明细进行关联,所......
  • 力扣584(MySQL)-寻找用户推荐人(简单)
    题目:给定表 customer ,里面保存了所有客户信息和他们的推荐人。写一个查询语句,返回一个客户列表,列表中客户的推荐人的编号都 不是 2。对于上面的示例数据,结果为: ......
  • SQL分组查询
    1前言SQL中分组查询分为GROUPBY分组和COMPUTEBY分组两种。笔者以案例的形式分别讲解两种查询方式。在SQLServer数据库上建立staff表,以eid为主键,表数据如下:2GR......
  • mysql的初体验——重装解决99%的问题
    这两天被java_web的作业搞得头皮发麻,主要原因就是因为jdbc连接数据库一直失败,甚至差点把电脑搞崩,删个注册表,结果用户变量也被删了,心态直接炸裂。有以下几个地方,引以为戒:1.......