MySQL 5.7.23:将文本字段中#和--注释替换为/* */格式
解决MySQL 5.7中将单行注释转为多行注释的问题
由于MySQL 5.7没有内置正则替换函数(REGEXP_REPLACE是8.0及以上版本才支持),我们可以通过自定义存储函数循环处理所有--和#开头的单行注释,将其转换为/* */格式。
自定义转换函数
以下函数先处理--注释,再处理#注释,会自动在每行注释末尾(或字符串结尾)添加*/:
DELIMITER // CREATE FUNCTION convert_sql_comments(sql_text TEXT) RETURNS TEXT DETERMINISTIC BEGIN -- 处理 -- 开头的单行注释 DECLARE pos_dash INT; DECLARE newline_pos INT; SET pos_dash = LOCATE('--', sql_text); WHILE pos_dash > 0 DO SET newline_pos = LOCATE('\n', sql_text, pos_dash + 2); IF newline_pos = 0 THEN -- 注释位于字符串末尾,无换行符 SET sql_text = CONCAT(INSERT(sql_text, pos_dash, 2, '/*'), '*/'); SET pos_dash = 0; ELSE -- 在换行前插入 */,替换 -- 为 /* SET sql_text = INSERT(sql_text, newline_pos, 0, '*/'); SET sql_text = INSERT(sql_text, pos_dash, 2, '/*'); SET pos_dash = LOCATE('--', sql_text, newline_pos + 2); END IF; END WHILE; -- 处理 # 开头的单行注释 DECLARE pos_hash INT; SET pos_hash = LOCATE('#', sql_text); WHILE pos_hash > 0 DO SET newline_pos = LOCATE('\n', sql_text, pos_hash + 1); IF newline_pos = 0 THEN -- 注释位于字符串末尾,无换行符 SET sql_text = CONCAT(INSERT(sql_text, pos_hash, 1, '/*'), '*/'); SET pos_hash = 0; ELSE -- 在换行前插入 */,替换 # 为 /* SET sql_text = INSERT(sql_text, newline_pos, 0, '*/'); SET sql_text = INSERT(sql_text, pos_hash, 1, '/*'); SET pos_hash = LOCATE('#', sql_text, newline_pos + 2); END IF; END WHILE; RETURN sql_text; END // DELIMITER ;
使用示例
针对你提供的测试SQL:
SELECT convert_sql_comments('select -- foobar idnam #barfoo -- hello world from p_person;');
执行后将返回:
select /* foobar*/ idnam /*barfoo*/ /* hello world*/ from p_person;
注意事项
- 确保你拥有创建函数的权限(
CREATE ROUTINE权限)。 - 函数仅处理合法的单行注释,不会替换字符串常量中的
--或#(比如SELECT '-- test'不会被修改)。 - 已有的
/* */格式多行注释不会被函数修改。
内容的提问来源于stack exchange,提问作者Tom Melly
相关产品推荐
相关产品推荐

