在Rails中保存后添加到属性的奇怪字节

fny*_*fny 15 ruby postgresql ruby-on-rails utf-8

我们遇到了一个疯狂的错误,在保存电子邮件时,看似随机的字节大约有90%的时间被添加到电子邮件字段.以下是可能发生的情况的示例:

From params: 'user@example.com'
Before validate: 'user@example.com'
After validate: 'user@example.com'
Before save: 'user@example.com'
Value in object after save: 'user@example.com'
Retrieve record just created by id, and fetch id: 'user@example.com\u007f'

哎呀\u007f(UTF-8删除字符!!!)来自哪里?!这是迄今为止最常见的垃圾.以下列出了一些其他有时出现的有效字节序列:

r\u007f
U\u007f
a\u007f
#m$\u007f

有时我得到完全垃圾比特,由于PG::CharacterNotInRepertoire错误,我无法判断是否有比这些更多的字节:

0xde 0x4d
0xf6 0x7f
0xbc
0xe3 0x6c 0x24
Run Code Online (Sandbox Code Playgroud)

鉴于PG::CharacterNotInRepertoire发生的错误,我假设这是在保存值之前的某个地方发生的,但是在我的应用程序代码范围之外.

请注意,对于用户的任何其他字段,这是奇怪的.

以下是当前触及电子邮件地址的所有回调:

  • #strip!#downcase!在验证之前
  • 使用正则表达式进行格式验证 \A[A-Za-z0-9._%+-]+@(?:[A-Za-z0-9-]+\.)+[A-Za-z]{2,20}\z

一些应用信息:

  • Ruby v2.2.0
  • Rails v4.1.8
  • Postgres v9.3.2
  • PG v0.17.1

fny*_*fny 25

事实证明pg-ruby<v0.18.0与Ruby v2.2不兼容,尽管没有相反的明显警告......

https://bitbucket.org/ged/ruby-pg/issue/210/crazy-bytes-being-added-to-record

立即升级或获取位数.