Tôi gặp sự cố tương tự:trường varchar với đối chiếu utf8_bin có mã hóa ASCII-8BIT.
Vấn đề nằm ở đá quý mysql2, không phải trong Rails, cũng không phải trong cài đặt mysql, ít nhất là trong trường hợp của tôi, bởi vì nó không xảy ra với đá quý ruby-mysql.
Vui lòng kiểm tra xem sự cố có biến mất khi bạn chuyển sang ruby-mysql không.
Đoạn mã sau, chạy từ irb trên ruby 1.9.2, giải thích sự cố:
require 'mysql2'
c = Mysql2::Client.new(host: "localhost", username: "root", database: 'd')
c.query("select word from t where word = 'a'").to_a[0]["word"].encoding
# => #<Encoding:ASCII-8BIT>
Điều này trên cơ sở dữ liệu mysql nơi mọi cài đặt có thể tưởng tượng đã được đặt thành đối chiếu utf8_bin.
Trong đá quý mysql2, trong result.c
tệp trên dòng 253, có đoạn mã sau:
if (fields[i].flags & BINARY_FLAG) {
rb_enc_associate(val, binaryEncoding);
} else ...
Tôi tin rằng đây là nơi mã hóa nhị phân (ASCII-8BIT) đang được đặt, có thể do đối chiếu utf8_bin ... Tôi đã xóa nó và nó đã giải quyết được sự cố, nhưng tôi chắc chắn rằng nó có thể sẽ gây ra các vấn đề khác, với các đốm màu chẳng hạn.