PostgreSQL中如何通过SELECT语句简便实现URL域名后内容的URL编码
简便实现URL域名后部分的编码(无需自定义函数)
当然有更简便的方法!不用折腾自定义函数或扩展,直接用数据库内置的字符串处理+URL编码函数组合就能在SELECT语句里完成需求。
核心思路
先从URL中提取域名之后的部分,再用内置URL编码函数对这部分内容编码,两步合并到同一个SELECT语句即可。
分步实现(以MySQL为例)
提取域名后的路径部分
- 如果域名固定(比如都是
https://www.google.com/),可以直接用REPLACE剥离域名:
执行后得到:SELECT REPLACE('https://www.google.com/search?q=Stack+Overflow', 'https://www.google.com/', '') AS path_part;search?q=Stack+Overflow - 如果域名不固定,用
LOCATE+SUBSTRING组合更通用(适配任意带https://前缀的URL):
这里SELECT SUBSTRING('https://www.google.com/search?q=Stack+Overflow', LOCATE('/', 'https://www.google.com/search?q=Stack+Overflow', 9)+1) AS path_part;LOCATE(..., 9)是从https://之后的位置开始找第一个斜杠(域名末尾的斜杠),再用SUBSTRING截取后续内容。
- 如果域名固定(比如都是
对路径部分进行URL编码
MySQL内置URL_ENCODE()函数可以直接完成URL编码,把两步合并:-- 固定域名场景 SELECT URL_ENCODE(REPLACE('https://www.google.com/search?q=Stack+Overflow', 'https://www.google.com/', '')) AS encoded_path; -- 通用域名场景 SELECT URL_ENCODE( SUBSTRING('https://www.google.com/search?q=Stack+Overflow', LOCATE('/', 'https://www.google.com/search?q=Stack+Overflow', 9)+1 ) ) AS encoded_path;执行后都会得到你期望的结果:
search%3Fq%3DStack+Overflow
其他数据库适配
不同数据库的内置函数略有差异,给出对应写法:
- PostgreSQL:
SELECT encode(convert_to( SUBSTRING('https://www.google.com/search?q=Stack+Overflow', POSITION('//www.google.com/' IN 'https://www.google.com/search?q=Stack+Overflow') + LENGTH('//www.google.com/') ), 'UTF8'), 'url') AS encoded_path; - SQL Server(2016+):
SELECT ENCODE_URL_COMPONENT( SUBSTRING('https://www.google.com/search?q=Stack+Overflow', CHARINDEX('//www.google.com/', 'https://www.google.com/search?q=Stack+Overflow') + LEN('//www.google.com/'), LEN('https://www.google.com/search?q=Stack+Overflow') ) ) AS encoded_path;
内容的提问来源于stack exchange,提问作者Matt
相关产品推荐
相关产品推荐

