如何在MySQL中查询包含YouTube视频链接的Post字段
解决方案
版本差异说明
- MySQL 5.x 仅支持 POSIX 扩展正则表达式,不兼容PHP常用的PCRE语法特性(比如非捕获组、
\d缩写、惰性匹配等),这是PHP正则无法直接在MySQL中复用的核心原因 - MySQL 8.0及以上版本默认使用ICU正则库,兼容大部分PCRE语法,仅需少量调整即可使用
全版本通用查询语句(兼容所有MySQL版本)
以下写法适配所有MySQL版本,可以直接筛选出包含YouTube链接的Post字段:
SELECT Post FROM 你的表名 WHERE Post REGEXP '(https?://)?(www\.)?(youtube\.com/watch\?v=|youtu\.be/)[[:alnum:]_-]{11}';
正则说明:
[[:alnum:]]是POSIX正则中匹配字母数字的标准写法,等价于PCRE语法中的[a-zA-Z0-9]- YouTube视频ID固定为11位,仅由字母、数字、下划线、短横线组成,用
[[:alnum:]_-]{11}可以精准匹配ID部分- 已覆盖带/不带http/https、带/不带www前缀、youtu.be短链接、youtube.com长链接的所有常见场景
MySQL 8.0专属优化写法
如果使用MySQL 8.0及以上版本,可以直接用接近PHP PCRE的简化写法:
SELECT Post FROM 你的表名 WHERE Post REGEXP '(https?://)?(www\.)?(?:youtube\.com/watch\?v=|youtu\.be/)[\w-]{11}';
可选:查询同时提取视频ID
MySQL 8.0+可以配合REGEXP_SUBSTR函数,在筛选的同时直接提取出视频ID:
SELECT Post, REGEXP_SUBSTR(Post, '(https?://)?(www\.)?(youtube\.com/watch\?v=|youtu\.be/)([[:alnum:]_-]{11})', 1, 1, 'c', 4) AS youtube_id FROM 你的表名 WHERE Post REGEXP '(https?://)?(www\.)?(youtube\.com/watch\?v=|youtu\.be/)[[:alnum:]_-]{11}';
内容的提问来源于stack exchange,提问作者Nem
相关产品推荐
相关产品推荐

