BigQuery JavaScript UDF中UTF归一化功能失效问题咨询
关于BigQuery JavaScript UDF中字符串normalize函数失效的问题
我尝试去除UTF字符串中的重音符号,但在BigQuery的JavaScript UDF中,字符串归一化(normalize)函数无法正常工作。我在浏览器环境中测试了相同的函数,能够得到正确结果;而BigQuery内置的归一化函数可以正常运行。我想了解:这种JavaScript UDF内的失效行为是否属于预期情况?背后可能的原因是什么?
示例查询
CREATE TEMP FUNCTION normAndRepl(s STRING) RETURNS STRING LANGUAGE js AS """ return s.normalize('NFD').replace(/[\u0300-\u036f]/g, '') """; CREATE TEMP FUNCTION repl(s STRING) RETURNS STRING LANGUAGE js AS """ return s.replace(/[\u0300-\u036f]/g, '') """; SELECT repl(normalize('München', NFD)), normAndRepl('München')
查询结果
查询结果中左列符合预期,但右列未得到预期结果:
f0_ | f1_
--------+--------
Munchen | München
问题原因与结论
其实这种情况是预期内的,主要是BigQuery的JavaScript UDF运行环境特性导致的:
- BigQuery的JS UDF基于旧版本的V8引擎,而字符串的
normalize方法是ES2015才正式引入的特性,早期V8对Unicode归一化的支持并不完整,甚至在这个环境下可能没完全实现该方法的完整功能。你在浏览器里测试正常,是因为现代浏览器的V8引擎早就更新到支持完整Unicode归一化的版本了,两者运行环境存在差异。 - 正因为JS UDF里的
normalize('NFD')没有正确将带重音的字符分解为基础字符+单独的重音符号,后续的正则替换自然匹配不到需要删除的重音字符,所以结果还是原字符串。 - 而BigQuery内置的
normalize函数是专门为SQL环境开发实现的,和JS UDF的运行引擎完全独立,所以能正常完成归一化操作。
内容的提问来源于stack exchange,提问作者wst
相关产品推荐
相关产品推荐

