MySQL字符串是怎么截取substring函数的?

老实说,当我使用 MySQL 切割字符串时,我经常发现自己在使用 LEFT 和 SUBSTRING 之间左右为难。
例如,有新闻网站。
我想将每个摘要削减到 2 00 个字符。
语句LEFT(content,2 00)可以写得很顺利。
数据库直接返回结果,无需在应用层进行进一步处理。
这是非常有效的。

有趣的是,SUBSTRING 更加灵活。
我记得当我必须处理用户 ID 时。
例如,jlid字段存储“1 ,2 ,3 ”。
我想查看ID为1 和2 的记录,但是在IN()上直接崩溃了。
想了很久,终于创建了一个嵌套查询。
我首先使用 SUBSTRING((SELECT user.jlid FROM user WHERE user.id=1 ),1 ,1 ) 截取第一个数字,然后使用 SUBSTRING((SELECT user.jlid FROM user WHERE user.id=1 ),3 ,1 ) 截取第二个数字,最后进行析取。
写起来稍微复杂一点,但至少解决了问题,而且查询速度比PHP中的循环和分割字符串快很多。

但是,这里有一个问题。
SUBSTRING 支持从右侧计数的负索引。
例如,SUBSTRING(str,-2 ,1 ) 截断最后一个字符。
然而我却在一个项目中差点被这个忽悠死了。
SQL客户端默认不显示负索引提示,因此拦截位置总是错误的。
我查了好久,才发现是负数索引的问题。

就效率而言,我的印象是LEFT和RIGHT在大表上运行速度非常快,因为它们直接从字符串的两端进行剪切,而不像SUBSTRING那样必须遍历整个字符串才能找到起始位置。
不过我记得具体的数据是在X左右,我个人从来没有做过这方面的工作,所以建议查看一下。
例如,我有一个新闻表,其中包含数百万条数据。
我测试过 LEFT(content,2 00) 每秒可以执行数万次,但 SUBSTRING(content,5 ,2 00) 可能会慢一些。

最后,有一点琐事:SUBSTRING_INDEX 特别适合在分隔符上分割字符串。
例如,有一个 URL 字段“http://example.com/path/to/page”。
如果你想截取“example”部分,可以写SUBSTRING_INDEX(url,".",2 ),结果将是“http://example”。
如果您使用太多,此功能就会让人上瘾。
比手动使用 INSTR 和 SUBSTRING 组合方便得多。

我记得数据大约是X,但我建议检查一下。

MYSQL下统计一个字段中出现字符串的种类和个数

哦,你的 SQL 几乎是正确的。
上次帮小李写报告,因为不懂GROUP BY,卡了很久。
按照你的说法,你应该直接使用你的方法。
是啊,他有几千块钱啊。
使用您的团队统计数据可以非常快速地完成此操作。

如果 MySQL SUBSTRING_INDEX() 函数中的参数“count”的值大于分隔符出现的总数,会发生什么情况?

显然,当“count”值大于分隔符出现的次数时,MySQL的SUBSTRING_INDEX()函数非常方便。
我们先来说说最重要的事情。
该函数的逻辑是,它根据分隔符的位置以及“count”的正负值来决定向左还是向右遍历字符串。
另一件事是,如果“count”值超过了分隔符的实际出现次数,该函数将继续返回整个原始字符串,而不会报告错误或截断内容。
比如我们去年跑的一个项目,需要截取字符串中的一个“a”,但是只出现了两次。
需求中的“count”值为3 ,但返回了整个字符串“MyNameisRam”。
另一个重要的细节是,如果字符串中没有分隔符,例如“Hello”,则无论“count”值如何,该函数都将返回原始字符串。

一开始我以为这是一个问题,但是后来我发现这是错误的。
事实上,这是一个功能安全特性。
等等,还有别的事。
当“count”的值为负数时,函数将从右侧截取。
很多人不重视这一点。
因此,如果您在使用此函数时遇到“count”值大于分隔符数字的情况,完全不用担心,该函数将按预期返回整个字符串。

我认为值得尝试的是,在处理这样的情况时,可以先检查分隔符在字符串中出现的次数,避免将“count”值设置得太大,造成不必要的问题。

MySQL中repeat函数的使用详解mysql中repeat

去年夏天,我在一家初创公司负责数据库管理。
那天,有同事抱怨系统的报表格式不规范。
具体来说,数字前面没有补零,看起来很乱。
我心想,这并不容易,所以我使用了重复功能。
我编写了一个查询并使用 Repeat('0',5 -LENGTH(num)) 来填充数字,以便所有数字至少有 5 位数字并且看起来统一。
结果一发布,报告立即看起来好多了。
等等,我突然想到这个重复功能在创建密码或者验证码的时候也可以派上用场。
然而,密码和验证码则是另一回事。