忍无可忍的Encoding

浪费了多少宝贵的时间?!

谭显英

2018/05/07

RSQLServer包正式退役了

RSQLServer于2018年4月10日正式退役(Archive),作者建议用r-dbi/odbc代替。

This package is archived as there is now an excellent, much better supported package odbc.

切换到odbc包

作为一个长期混迹于Github的码农,很早前便注意到odbc这个包了。的确,odbc更快更轻(不需要安装Java),也在积极开发中。而RSQLServer则有点缺乏维护,加上之前引入了dplyr的一些功能,不时会引起冲突,我便一直手痒想切换过去。虽然做了一些比较和测试,基本没看出问题,但却暗暗担心会遇到些意想不到的毛病。

不过既然早晚都要切换,宜早不宜迟。记得 “The Pragmatic Programmer” 有句很经典的论断:

Refactor Early, Refactor Often.

果然,没多久就发现有些脚本的结果有些奇怪了。排查了半天后,终于发现了问题:odbc并没有像RODBC或者RJDBC一样,预先把SQL字符编码转换成和数据库一致的字符编码。 坑爹的是,我很少会在SQL中用中文,正好那个别的中文虽然转换成了垃圾字符但并不会报错,只是返回的结果不一样 😡。

早上在Github上提交了报告r-dbi/odbc#179,感觉强制将SQL转换成和数据库的字符编码应该可行(RODBC::odbcQuery()就是这么做的),但考虑到我实在不是数据库专家,还是不提交PR献丑了,留给作者Jim Hester解决吧…

浪费时间

计算机的世界里,字符编码Encoding真是奇葩得不行,尤其是在windows上(哦,我们也别忘了另外一个奇葩:时区Timezone)。回想起这些年码农的日子,在这两个奇葩上耗费了无数的宝贵时间,列举一些我印象比较深刻的:

恐怕大家都多多少少被这些问题折磨过,可折腾来折腾去,究竟有多少意义?最悲哀的是,无论之前踩了再多坑,后面却有更多坑等着你 😂。

(嘚瑟下我提交PR修复的问题)

未来

按照Tomas Kalibera这两篇文章的说法,Windows10(2019.11后的版本)开始允许应用使用UTF-8编码和操作系统进行交互了。所以,将R和相关包的编译工具改为UCRT后,Windows下Encoding的大部分问题可能就在根源上得以解决。不过,文章中并没有明确R未来的计划安排,但我们至少看到了一丝的希望。