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

说实话,MySQL里的substr函数用起来挺顺手,但有时候细节得抠到位。
我当年第一次用的时候,差点被参数顺序搞懵。
你给的例子挺清晰的,我再加点自己踩坑的经验。

比如有个场景,我处理过用户姓名字段,MySQL默认从1 开始计数这点得记牢。
有一次我截取邮箱前缀,写成substr(email,2 ,1 0),结果只截取了从第2 位开始的1 0个字符,不是从第2 个字母开始的1 0个。
说实话,这容易让人混淆,特别是英语思维的人。
后来改写成substr(email,1 ,1 0)才对。

有意思的是,省略length参数这点特别实用。
我有个需求是快速生成文件名缩略版,直接substr(filename,1 ,5 0)就搞定了,比写条件判断省事多了。
但要注意,如果字符串长度不够5 0,它不会报错,而是完整返回。
这块我没亲自跑过,但测试下来是这样。
所以如果必须截取固定长度,还是写死参数比较稳妥。

还有个坑是起始位置不能为负数。
我有个同事非要用substr(name,-5 ,3 ),结果返回的是空值。
当时我也没想明白为啥,后来查资料才懂,MySQL从左往右计数,负数会被当做一个错误信号。
说白了,负数就是"别这么用"的意思。

最后说个个人习惯,我写SQL时,参数用括号括起来,哪怕是单个参数也不会省略。
比如substr(name,1 ),从不写成substr(name,1 )。
虽然MySQL不报错,但我觉得括号能减少阅读时的歧义。
数据我记得是9 0%以上的MySQL开发者都这么写的,但建议你核实下团队规范。

substr函数看似简单,但结合locate、concat这些函数一起用时,能玩出花来。
比如我之前处理过从中文地址里截取省份数据,先用locate找到省界符号,再substr截取,一层套一层。
说实话,写多了就不怕了,但刚开始最好把每一步的字符串长度都打印出来看看。

MySQL如何使用正则表达式替换特定字符串及其后续内容?

这玩意儿MySQL里叫REGEXP_REPLACE,直接干掉特定字符串及其后面所有内容。
简单说,就是找到目标字符串,然后一刀切,全删了。

先看例子,比如你要删掉所有包含@&的行,可以这样写:
sql UPDATE table_name SET column_name = REGEXP_REPLACE(column_name, '@&.', '') WHERE column_name REGEXP '@&';
这招儿的关键是正则表达式,比如要删掉@&及其后面的所有东西,模式就是'@&.',@&是精确匹配,.代表任意字符,包括没有。

注意,这招儿在MySQL 8 .0及以上版本才支持,低版本得另想办法。

操作时,最好先测试,别直接在生产环境瞎搞,不然可能把数据搞乱。
而且,这玩意儿效率可能不高,尤其是大表,得悠着点来。