mysql2 icon indicating copy to clipboard operation
mysql2 copied to clipboard

Encoding-aware `Mysql2::Client#escape` does not consistently escape/encode binary strings

Open qcn opened this issue 10 months ago • 0 comments

Using a Mysql2::Client with encoding: 'utf8mb4', passing a standard binary string (ASCII 8-bit encoded) to the encoding-aware #escape method sometimes returns an escaped string with UTF-8 encoding, and sometimes returns an unchanged binary string maintaining its ASCII 8-bit encoding. I'd expect that all binary string inputs would return an output in the same encoding, whether that's escaped UTF-8 or unchanged ASCII 8-bit.

Reproduction:

irb(main):014> client = ::Mysql2::Client.new(mysql_opts.merge({encoding: 'utf8mb4'}))
=> 
#<Mysql2::Client:0x00007fe881b54200
...
irb(main):015> hex1 = '6614ed2fb7e749cda6caab6ca6b34dcc'
=> "6614ed2fb7e749cda6caab6ca6b34dcc"
irb(main):016> hex2 = 'bafe80143bbe4bd3ba785d0679192fbf'
=> "bafe80143bbe4bd3ba785d0679192fbf"
irb(main):017> bin1 = [hex1].pack('H*')
=> "f\x14\xED/\xB7\xE7I\xCD\xA6\xCA\xABl\xA6\xB3M\xCC"
irb(main):018> bin1.encoding
=> #<Encoding:ASCII-8BIT>
irb(main):019> bin2 = [hex2].pack('H*')
=> "\xBA\xFE\x80\x14;\xBEK\xD3\xBAx]\x06y\x19/\xBF"
irb(main):020> bin2.encoding
=> #<Encoding:ASCII-8BIT>
irb(main):021> client.escape(bin1)
=> "f\u0014\\\xED/\xB7\\\xE7Iͦʫl\xA6\xB3M\\\xCC"
irb(main):022> client.escape(bin1).encoding
=> #<Encoding:UTF-8>
irb(main):023> client.escape(bin2)
=> "\xBA\xFE\x80\x14;\xBEK\xD3\xBAx]\x06y\x19/\xBF"
irb(main):024> client.escape(bin2).encoding
=> #<Encoding:ASCII-8BIT>

qcn avatar Apr 11 '24 05:04 qcn