本文介绍: 笔者最近有一个需求需要将一段文字插入备注字段remark前面。由于担心插入后超过字段长度限制,所以需要统计线上数据,根据长度倒序查询remark最长的一批数据看看长度,于是决定探究一下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问题,旨在记录和鞭策自身建立一种健康学习方式,主动探究问题,而不只是简单地获取他人的解决方案

原文地址:https://blog.csdn.net/weixin_43549148/article/details/129654175

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任

如若转载,请注明出处:http://www.7code.cn/show_31652.html

如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱suwngjj01@126.com进行投诉反馈,一经查实,立即删除

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注