class Mysql2::Error
def self.new_with_args(msg, server_version, error_number, sql_state)
def self.new_with_args(msg, server_version, error_number, sql_state) error_class = CODES.fetch(error_number, self) error_class.new(msg, server_version, error_number, sql_state) end
def clean_message(message)
valid UTF-8 character.
encoding, we'll assume UTF-8 and clean the string of anything that's not a
So in an attempt to make sure the error message string is always in a valid
more information.
See http://dev.mysql.com/doc/refman/5.1/en/charset-errors.html for
corrupt encoding-wise.
koi8r string raw. Meaning there's a high probability the string will be
be in any encoding MySQL supports and is insert into the latin1, euckr or
The issue is that the user-data inserted in the message could potentially
for more information.
See http://dev.mysql.com/doc/refman/5.1/en/error-message-language.html
is associated with the error message language.
Before MySQL 5.5 error message template strings are in whatever encoding
more context.
See http://dev.mysql.com/doc/refman/5.5/en/charset-errors.html for
variable.
then returned in the encoding set by the `character_set_results` system
In MySQL 5.5+ error messages are always constructed server-side as UTF-8
def clean_message(message) if @server_version && @server_version > 50500 message.encode(**ENCODE_OPTS) else message.encode(Encoding::UTF_8, **ENCODE_OPTS) end end
def initialize(msg, server_version = nil, error_number = nil, sql_state = nil)
def initialize(msg, server_version = nil, error_number = nil, sql_state = nil) @server_version = server_version @error_number = error_number @sql_state = sql_state ? sql_state.encode(**ENCODE_OPTS) : nil super(clean_message(msg)) end