From 1f59ae601468024174bc3b32eb1b4ae6fbc61222 Mon Sep 17 00:00:00 2001 From: Serge Balyuk Date: Tue, 6 Jul 2010 14:28:15 +0300 Subject: [PATCH] Strings quoted by MysqlAdapter should be encoded according to DB charset (#5006) --- .../connection_adapters/mysql_adapter.rb | 5 +++- .../adapters/mysql/connection_encoding_test.rb | 21 ++++++++++++++++++++ 2 files changed, 25 insertions(+), 1 deletions(-) create mode 100644 activerecord/test/cases/adapters/mysql/connection_encoding_test.rb diff --git a/activerecord/lib/active_record/connection_adapters/mysql_adapter.rb b/activerecord/lib/active_record/connection_adapters/mysql_adapter.rb index aa3626a..ec8ee86 100644 --- a/activerecord/lib/active_record/connection_adapters/mysql_adapter.rb +++ b/activerecord/lib/active_record/connection_adapters/mysql_adapter.rb @@ -206,7 +206,10 @@ module ActiveRecord end def quote_string(string) #:nodoc: - @connection.quote(string) + encoding = Encoding.find(@config[:ruby_encoding]) rescue nil + encoded_string = encoding ? string.encode(encoding) : string + quoted_string = @connection.quote(encoded_string) + encoding ? quoted_string.force_encoding(encoding) : quoted_string end def quoted_true diff --git a/activerecord/test/cases/adapters/mysql/connection_encoding_test.rb b/activerecord/test/cases/adapters/mysql/connection_encoding_test.rb new file mode 100644 index 0000000..15ddda9 --- /dev/null +++ b/activerecord/test/cases/adapters/mysql/connection_encoding_test.rb @@ -0,0 +1,21 @@ +# encoding: ascii + +require "cases/helper" + +class MysqlConnectionEncodingTest < ActiveRecord::TestCase + + if '1.9'.respond_to?(:encoding) + def test_quote_encoding + ActiveRecord::Base.configurations['arunit_with_encoding'] = + ActiveRecord::Base.configurations['arunit'].merge(:encoding => 'latin1', :ruby_encoding => 'iso-8859-1') + ActiveRecord::Base.establish_connection('arunit_with_encoding') + name = "St\xC3\xA9phane".force_encoding('utf-8') + quoted_name = ActiveRecord::Base.connection.quote(name) + assert_equal Encoding::ISO_8859_1, quoted_name.encoding + assert_equal "'St\xE9phane'".force_encoding('iso-8859-1'), quoted_name + ensure + ActiveRecord::Base.establish_connection('arunit') + end + end + +end -- 1.7.1