前言:今天接到一个需求,开发要求帮忙将线上某个表的某个字段中的第100个字符批量替换成另外一个字符,举个例子来说,tab1表有个name列,为varchar(10),例如有一行值为aaabbcbccc,我现在要把第8个字符,也就是第二个c修改为g。

    接到这个需求,想了想自己貌似没有在MySQL数据库做过这样的批量操作,首先第一个想到的方法是用replace+substring函数来做批量替换,但是后面想了想,replace可以把整个字段所有的匹配的值都替换,并不符合我们现有需求。

    无奈之下,我们只能选择使用concat函数来完成整个需求,基本思路是先取出前7位,然后用g拼接作为第8位,然后拼接第9位和后面的字符串即可,这样一来的限制是我们替换的字符长度都必须超过100位才行,如果少于100位替换后的值就不准确了,利用select length(col) from tab1查看了线上的值分布情况,所幸所有的值长度均超过100位,这样一来就比较好操作了。

    下面我们来演示一下批量替换的操作
    现有表tab1数据分布如下:

    1. root@localhost [xucl]>select * from tab1;
    2. +------------+
    3. | name |
    4. +------------+
    5. | aaabbcbccc |
    6. | aaaaaaaaa |
    7. +------------+
    8. 2 rows in set (0.00 sec)

    值长度分布如下:

    root@localhost [xucl]>select length(name) from tab1;
    +--------------+
    | length(name) |
    +--------------+
    |           10 |
    |            9 |
    +--------------+
    2 rows in set (0.00 sec)
    

    替换如下:

    root@localhost [xucl]>update tab1 set name=concat(substring(name,1,7),'g',substring(name,9));
    Query OK, 2 rows affected (0.00 sec)
    Rows matched: 2  Changed: 2  Warnings: 0
    

    查看替换后的值:

    root@localhost [xucl]>select * from tab1;
    +------------+
    | name       |
    +------------+
    | aaabbcbgcc |
    | aaaaaaaga  |
    +------------+
    2 rows in set (0.00 sec)
    

    符合我们的需求,OK搞定!