mysql substr()函数如何截取字符串并指定起始位置和长度?

嘿,你提到的MySQL子树实际上是在开发过程中常用的。
当时我正在为上海的一家公司做一个项目,大概是在 2 01 8 年。
我要处理很多用户名。
有些名称太长,必须缩短才能在存储在数据库中时显示。
我只是想,怎样切才是最合适的。

想一想,有一个字段叫username,里面包含了用户的昵称。
我需要删除每个昵称的前 5 个字符并将其显示在网页上,这样它就不会显得太长。
现在我使用 substr(username, 1 , 5 ) 函数。
非常简单,使用即可。
结果效果很好,网页显示的用户名清晰,客户也很满意。

还有一次,同样是在那个时期,需要公开邮箱前缀。
例如,用户的电子邮件地址是zhangsan@example.com,我只想显示zhangsan部分。
这很容易做到,我使用 substr(username, 1 ,locate('@', username)
1 )。
看,先用locate('@', username)找到@的位置,然后从1 到@开头截取。
对于 zhangsan@example.com,locate('@', username) 返回 9 ,减去 1 得到 8 ,然后 substr(username, 1 , 8 ) 将得到 zhangsan。
这个技巧非常实用。

但是如果省略了截取的长度,比如substr(username, 1 ),就会在字符串末尾截取。
有一次我忘了写长度。
结果有些用户名特别长而且显示不完整,我不得不再次更改。
所以使用的时候要小心,不要忘记写上长度。

另外,如果你截取的起始位置太大,比如substr(username, 1 0, 5 ),如果username少于1 0个字符,就会返回空字符串。
当时我有一个项目,用户名只有 3 个字符。
如果我这样写,它会返回空白,我必须添加评级,否则空白显示会影响显示。

总之,如果你经常使用 substr 函数,它就会变得很容易使用。
你提到的两个例子,一个是截取前几个字符,另一个是截取特定字符之前,都是基本用途。
只要你明白了。
如果还有什么不明白的,可以再问我。

mysql中字符串的位置

说白了,MySQL的LOCATE函数就是用来定位字符串的。
这确实很简单。
我们先来说说最重要的事情。
该函数的基本用法是LOCATE(substring, string)。
例如,如果您要搜索的子字符串是“abc”,而您要搜索的字符串是“defabsighi”,那么结果就是 5 ,因为“abc”首先出现在“defabsighi”的第 5 个位置。
其次,LOCATE函数还可以从指定位置开始搜索。
使用 LOCATE(子字符串,字符串,起始位置)。
例如,如果从第 6 个位置开始搜索“ABC”,则结果将为 8 ,因为从第 6 个位置开始计算,“ABC”排在第 8 个位置。
还有一个更重要的细节。
如果没有找到子字符串,这个函数就会返回0。

一开始我也以为LOCATE只适合简单的搜索,但后来我发现它在处理文本数据时其实非常有用。
比如我们去年跑的一个项目,需要从大量文档中提取特定关键词的位置。
LOCATE 派上了用场。
数据量在3 000条左右,使用LOCATE处理效率相当高。

等等,还有一件事,这个函数在搜索时不区分大小写。
老实说,这很令人困惑,有时您可能希望它区分大小写,但这是默认行为。
我认为值得尝试的是在搜索之前聚合数据,例如将所有内容转换为小写,然后使用 LOCATE。

最后,如果你在实际操作中LOCATE,记得检查返回值是否为0,避免不匹配造成的问题。

mysql instr条件查询的实现

结论:MySQL中使用INSTR进行模糊匹配,比LIKE更加灵活。

简单易用:查找“小明”,INSTR(name,'小明')>0。

位置搜索:SELECT id, title, INSTR(content,'MySQL') AS pos FROM posts HAVING pos>0。

比 LIKE 更好:精确放置,无需通配符。

与大小写无关:INSTR(LOWER(message),'error')>0。

应用场景:关键词搜索、日志分析、数据清洗。

注意:WHERE不能直接使用别名,请使用HAVING。

性能:LIKE更多关键字、通配符、INSTR更高效。

自己掂量一下。