sql查询中的base64子串
问题描述:
我使用aws中的athena来解析一堆日志文件。查询的标准是一个base64编码的子字符串。 (“adId = eW0vMU0zeGE5NUE4NjcyLzYzNDgvalhkVGhkZmxfODQwS182NDB4MzYwLm1wNAo =%somejunk”)sql查询中的base64子串
据我所知,这个查询没有问题。
SELECT count(*)
FROM reporting."logs"
WHERE sc_status NOT LIKE '404'
AND cs_cookie LIKE 'adId%'
AND cs_uri_stem LIKE'%.m3u8'
AND FROM_UTF8(from_base64(regexp_extract(cs_cookie, '(adId=)([^ ]+?)\%(.*)',2))) LIKE '%mp4' limit 1 ;
它给我的错误INVALID_FUNCTION_ARGUMENT:非法的base64字符5F
不同的版本,使用的所有组件,不返回一个错误,给了我,在MP4结束值。
SELECT FROM_UTF8(from_base64(regexp_extract(cs_cookie, '(adId=)([^ ]+?)\%(.*)',2)))
FROM reporting."logs"
WHERE sc_status NOT LIKE '404'
AND cs_cookie LIKE 'adId%'
AND cs_uri_stem LIKE'%.m3u8' limit 1 ;
返回值没有任何真正奇怪的地方。
ym/1M3xa95A8672/6348/jXdThdfl_840K_640x360.mp4
任何想法,为什么我会得到一个错误或如何格式化,所以它会工作?
答
看起来像有一些不安全的字符,因为它是一个网址。不得不替换一些无效的base64字符。
工作版本
SELECT *
FROM reporting."logs"
WHERE sc_status LIKE '2__'
AND date(date) = current_date - interval '1' day
AND cs_cookie LIKE 'adId%'
AND cs_uri_stem LIKE'%ad.m3u8'
AND FROM_UTF8(from_base64(replace(replace(regexp_extract(cs_cookie, '(adId=)([^ ]+?)\%(.*)',2), '_','/'),'-','+'))) LIKE '%mp4'
基于64位功能作为直接的直通到内置在Java中Base64编码实现的:https://docs.oracle.com/javase/8/docs/api/java/ UTIL/Base64.html –