我是菜鸟,大家不要笑我。。。
用 ruby 写了一个小爬虫,想把爬下来的数据存到 MySQL 里,没有用 dbi 或者 sequel,中文内容 insert 后会报错 1064,incompatible character encodings: UTF-8 and ASCII-8BIT (Encoding::CompatibilityError)
我试过用 force_encoding 转为 utf-8,可没什么用,还是同样的错误
在网上找了半天也没有什么好用的办法,希望大家指点一下啊
如果不是代码中出现中文,恐怕是数据库的设置问题。 在 mysql 命令行中用 show variables like 'char%';看看是否有支持中文的字符集吧,比如 utf-8\gbk 什么的。
这个问题我时常会遇到,但是目前为止依然没找到根源(引出这个错误的原因有很多种) 结果就是反复查代码,不知不觉就解决了。 以前还发现某个 Cache 里面的数据导致出这个编码错误...
这个错误是 ruby 的 String 编码不合,应该跟 mysql 无关。
像是从 CSV 读资料进来时,若没有指定编码为 UTF-8,那读进来的 String 会是 ASCII-8BIT。
具体情况不清楚,不过提醒一下,有人会误用 force_encoding,而这个 api 是不改变原始的字节数组的
$ irb
1.9.2p290 :001 > "中".each_byte{|x| p x}
228
184
173
=> "中"
1.9.2p290 :002 > "中".force_encoding('gbk').each_byte{|x| p x}
228
184
173
=> "\x{E4B8}\xAD"
#4 楼 @huacnlee 昨晚还遇到了由于 cache 引起的这个问题,本地 dev 和 production 都好的,到服务器上 dev 好的,production 就是报错,最后发现是 memcached 的缓存问题。
这个问题我通常会在页面 render 的时候遇到,我一般这么查:
表示使用通杀方法 set names utf8 一直插入显示各种无问题
require 'mysql2'
c = Mysql2::Client.new(username:'scott',password:'tiger',database:'draw_something')
c.query('set names utf8')
c.query("insert into fuckphp set(name, action) values('php', 'fuck')")
@cdredfox String#force_encoding在ruby1.9.3下面只是更改字符串的编码标识,而不会更改字符自身的编码.Encoding#default_external,Encoding#default_internal的设置会对读进来的字符串编码产生影响~
c.query('set names gbk') 解决了我的乱码问题。mysql 数据库表是 gbk 的。但是仍然有一些乱码中文,insert 出错。