Skip to content

Commit 3957ed9

Browse files
committed
Merge pull request #642 from takatoshiono/escape-default-internal-enc
Fix encoding if Mysql2#escape was nothing escaped
2 parents b3cfa21 + 088c0fe commit 3957ed9

File tree

2 files changed

+18
-0
lines changed

2 files changed

+18
-0
lines changed

ext/mysql2/client.c

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -720,6 +720,11 @@ static VALUE rb_mysql_client_real_escape(VALUE self, VALUE str) {
720720
newLen = mysql_real_escape_string(wrapper->client, (char *)newStr, RSTRING_PTR(str), oldLen);
721721
if (newLen == oldLen) {
722722
/* no need to return a new ruby string if nothing changed */
723+
#ifdef HAVE_RUBY_ENCODING_H
724+
if (default_internal_enc) {
725+
str = rb_str_export_to_enc(str, default_internal_enc);
726+
}
727+
#endif
723728
xfree(newStr);
724729
return str;
725730
} else {

spec/mysql2/client_spec.rb

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -703,6 +703,19 @@ def run_gc
703703
@client.escape ""
704704
}.to raise_error(Mysql2::Error)
705705
end
706+
707+
context 'when mysql encoding is not utf8' do
708+
before { pending('Encoding is undefined') unless defined?(Encoding) }
709+
710+
let(:client) { Mysql2::Client.new(DatabaseCredentials['root'].merge(:encoding => "ujis")) }
711+
712+
it 'should return a internal encoding string if Encoding.default_internal is set' do
713+
with_internal_encoding Encoding::UTF_8 do
714+
expect(client.escape("\u{30C6}\u{30B9}\u{30C8}")).to eq "\u{30C6}\u{30B9}\u{30C8}"
715+
expect(client.escape("\u{30C6}'\u{30B9}\"\u{30C8}")).to eq "\u{30C6}\\'\u{30B9}\\\"\u{30C8}"
716+
end
717+
end
718+
end
706719
end
707720

708721
it "should respond to #info" do

0 commit comments

Comments
 (0)