The MySQL adapter will work with both Ruby/MySQL, which is a Ruby-based MySQL adapter that comes bundled with Active Record, and with the faster C-based MySQL/Ruby adapter (available both as a gem and from www.tmtm.org/en/mysql/ruby/).

Options:

  • :host - Defaults to “localhost”.

  • :port - Defaults to 3306.

  • :socket - Defaults to “/tmp/mysql.sock”.

  • :username - Defaults to “root”

  • :password - Defaults to nothing.

  • :database - The name of the database. No default, must be provided.

  • :encoding - (Optional) Sets the client encoding by executing “SET NAMES <encoding>” after connection.

  • :reconnect - Defaults to false (See MySQL documentation: dev.mysql.com/doc/refman/5.0/en/auto-reconnect.html).

  • :sslca - Necessary to use MySQL with an SSL connection.

  • :sslkey - Necessary to use MySQL with an SSL connection.

  • :sslcert - Necessary to use MySQL with an SSL connection.

  • :sslcapath - Necessary to use MySQL with an SSL connection.

  • :sslcipher - Necessary to use MySQL with an SSL connection.

Methods
A
C
D
E
L
N
P
Q
R
S
T
Constants
ADAPTER_NAME = 'MySQL'
LOST_CONNECTION_ERROR_MESSAGES = [ "Server shutdown in progress", "Broken pipe", "Lost connection to MySQL server during query", "MySQL server has gone away" ]
QUOTED_FALSE = '1', '0'
NATIVE_DATABASE_TYPES = { :primary_key => "int(11) DEFAULT NULL auto_increment PRIMARY KEY", :string => { :name => "varchar", :limit => 255 }, :text => { :name => "text" }, :integer => { :name => "int", :limit => 4 }, :float => { :name => "float" }, :decimal => { :name => "decimal" }, :datetime => { :name => "datetime" }, :timestamp => { :name => "datetime" }, :time => { :name => "time" }, :date => { :name => "date" }, :binary => { :name => "blob" }, :boolean => { :name => "tinyint", :limit => 1 } }
ENCODINGS = { "armscii8" => nil, "ascii" => Encoding::US_ASCII, "big5" => Encoding::Big5, "binary" => Encoding::ASCII_8BIT, "cp1250" => Encoding::Windows_1250, "cp1251" => Encoding::Windows_1251, "cp1256" => Encoding::Windows_1256, "cp1257" => Encoding::Windows_1257, "cp850" => Encoding::CP850, "cp852" => Encoding::CP852, "cp866" => Encoding::IBM866, "cp932" => Encoding::Windows_31J, "dec8" => nil, "eucjpms" => Encoding::EucJP_ms, "euckr" => Encoding::EUC_KR, "gb2312" => Encoding::EUC_CN, "gbk" => Encoding::GBK, "geostd8" => nil, "greek" => Encoding::ISO_8859_7, "hebrew" => Encoding::ISO_8859_8, "hp8" => nil, "keybcs2" => nil, "koi8r" => Encoding::KOI8_R, "koi8u" => Encoding::KOI8_U, "latin1" => Encoding::ISO_8859_1, "latin2" => Encoding::ISO_8859_2, "latin5" => Encoding::ISO_8859_9, "latin7" => Encoding::ISO_8859_13, "macce" => Encoding::MacCentEuro, "macroman" => Encoding::MacRoman, "sjis" => Encoding::SHIFT_JIS, "swe7" => nil, "tis620" => Encoding::TIS_620, "ucs2" => Encoding::UTF_16BE, "ujis" => Encoding::EucJP_ms, "utf8" => Encoding::UTF_8, "utf8mb4" => Encoding::UTF_8, }
 

Taken from here:

https://github.com/tmtm/ruby-mysql/blob/master/lib/mysql/charset.rb

Author: TOMITA Masahiro <tommy@tmtm.org>

Class Public methods
emulate_booleans

By default, the MysqlAdapter will consider all columns of type tinyint(1) as boolean. If you wish to disable this emulation (which was the default behavior in versions 0.13.1 and earlier) you can add the following line to your application.rb file:

ActiveRecord::ConnectionAdapters::MysqlAdapter.emulate_booleans = false
# File activerecord/lib/active_record/connection_adapters/mysql_adapter.rb, line 159
cattr_accessor :emulate_booleans
new(connection, logger, connection_options, config)
# File activerecord/lib/active_record/connection_adapters/mysql_adapter.rb, line 187
def initialize(connection, logger, connection_options, config)
  super(connection, logger)
  @connection_options, @config = connection_options, config
  @quoted_column_names, @quoted_table_names = {}, {}
  @statements = {}
  @client_encoding = nil
  connect
end
Instance Public methods
active?()

CONNECTION MANAGEMENT ====================================

# File activerecord/lib/active_record/connection_adapters/mysql_adapter.rb, line 288
def active?
  if @connection.respond_to?(:stat)
    @connection.stat
  else
    @connection.query 'select 1'
  end

  # mysql-ruby doesn't raise an exception when stat fails.
  if @connection.respond_to?(:errno)
    @connection.errno.zero?
  else
    true
  end
rescue Mysql::Error
  false
end
add_column(table_name, column_name, type, options = {})
# File activerecord/lib/active_record/connection_adapters/mysql_adapter.rb, line 669
def add_column(table_name, column_name, type, options = {})
  execute("ALTER TABLE #{quote_table_name(table_name)} #{add_column_sql(table_name, column_name, type, options)}")
end
add_column_position!(sql, options)
# File activerecord/lib/active_record/connection_adapters/mysql_adapter.rb, line 710
def add_column_position!(sql, options)
  if options[:first]
    sql << " FIRST"
  elsif options[:after]
    sql << " AFTER #{quote_column_name(options[:after])}"
  end
end
case_sensitive_equality_operator()
# File activerecord/lib/active_record/connection_adapters/mysql_adapter.rb, line 741
def case_sensitive_equality_operator
  "= BINARY"
end
case_sensitive_modifier(node)
# File activerecord/lib/active_record/connection_adapters/mysql_adapter.rb, line 746
def case_sensitive_modifier(node)
  Arel::Nodes::Bin.new(node)
end
change_column_null(table_name, column_name, null, default = nil)
# File activerecord/lib/active_record/connection_adapters/mysql_adapter.rb, line 678
def change_column_null(table_name, column_name, null, default = nil)
  column = column_for(table_name, column_name)

  unless null || default.nil?
    execute("UPDATE #{quote_table_name(table_name)} SET #{quote_column_name(column_name)}=#{quote(default)} WHERE #{quote_column_name(column_name)} IS NULL")
  end

  change_column table_name, column_name, column.sql_type, :null => null
end
charset()

Returns the database character set.

# File activerecord/lib/active_record/connection_adapters/mysql_adapter.rb, line 580
def charset
  show_variable 'character_set_database'
end
clear_cache!()

Clears the prepared statements cache.

# File activerecord/lib/active_record/connection_adapters/mysql_adapter.rb, line 336
def clear_cache!
  @statements.values.each do |cache|
    cache[:stmt].close
  end
  @statements.clear
end
client_encoding()

Get the client encoding for this database

# File activerecord/lib/active_record/connection_adapters/mysql_adapter.rb, line 391
def client_encoding
  return @client_encoding if @client_encoding

  result = exec_query(
    "SHOW VARIABLES WHERE Variable_name = 'character_set_client'",
    'SCHEMA')
  @client_encoding = ENCODINGS[result.rows.last.last]
end
collation()

Returns the database collation strategy.

# File activerecord/lib/active_record/connection_adapters/mysql_adapter.rb, line 585
def collation
  show_variable 'collation_database'
end
create_database(name, options = {})

Create a new MySQL database with optional :charset and :collation. Charset defaults to utf8.

Example:

create_database 'charset_test', :charset => 'latin1', :collation => 'latin1_bin'
create_database 'matt_development'
create_database 'matt_development', :charset => :big5
# File activerecord/lib/active_record/connection_adapters/mysql_adapter.rb, line 559
def create_database(name, options = {})
  if options[:collation]
    execute "CREATE DATABASE `#{name}` DEFAULT CHARACTER SET `#{options[:charset] || 'utf8'}` COLLATE `#{options[:collation]}`"
  else
    execute "CREATE DATABASE `#{name}` DEFAULT CHARACTER SET `#{options[:charset] || 'utf8'}`"
  end
end
create_savepoint()
# File activerecord/lib/active_record/connection_adapters/mysql_adapter.rb, line 483
def create_savepoint
  execute("SAVEPOINT #{current_savepoint_name}")
end
current_database()
# File activerecord/lib/active_record/connection_adapters/mysql_adapter.rb, line 575
def current_database
  select_value 'SELECT DATABASE() as db'
end
disconnect!()

Disconnects from the database if already connected. Otherwise, this method does nothing.

# File activerecord/lib/active_record/connection_adapters/mysql_adapter.rb, line 313
def disconnect!
  @connection.close rescue nil
end
drop_table(table_name, options = {})
# File activerecord/lib/active_record/connection_adapters/mysql_adapter.rb, line 610
def drop_table(table_name, options = {})
  super(table_name, options)
end
exec_delete(sql, name, binds)
This method is also aliased as exec_update
# File activerecord/lib/active_record/connection_adapters/mysql_adapter.rb, line 456
def exec_delete(sql, name, binds)
  log(sql, name, binds) do
    exec_stmt(sql, name, binds) do |cols, stmt|
      stmt.affected_rows
    end
  end
end
exec_query(sql, name = 'SQL', binds = [])
# File activerecord/lib/active_record/connection_adapters/mysql_adapter.rb, line 400
def exec_query(sql, name = 'SQL', binds = [])
  log(sql, name, binds) do
    exec_stmt(sql, name, binds) do |cols, stmt|
      ActiveRecord::Result.new(cols, stmt.to_a) if cols
    end
  end
end
exec_update(sql, name, binds)
last_inserted_id(result)
# File activerecord/lib/active_record/connection_adapters/mysql_adapter.rb, line 408
def last_inserted_id(result)
  @connection.insert_id
end
limited_update_conditions(where_sql, quoted_table_name, quoted_primary_key)
# File activerecord/lib/active_record/connection_adapters/mysql_adapter.rb, line 750
def limited_update_conditions(where_sql, quoted_table_name, quoted_primary_key)
  where_sql
end
primary_key(table)

Returns just a table’s primary key

# File activerecord/lib/active_record/connection_adapters/mysql_adapter.rb, line 736
def primary_key(table)
  pk_and_sequence = pk_and_sequence_for(table)
  pk_and_sequence && pk_and_sequence.first
end
quote(value, column = nil)

QUOTING ==================================================

# File activerecord/lib/active_record/connection_adapters/mysql_adapter.rb, line 236
def quote(value, column = nil)
  if value.kind_of?(String) && column && column.type == :binary && column.class.respond_to?(:string_to_binary)
    s = column.class.string_to_binary(value).unpack("H*")[0]
    "x'#{s}'"
  elsif value.kind_of?(BigDecimal)
    value.to_s("F")
  else
    super
  end
end
quoted_false()
# File activerecord/lib/active_record/connection_adapters/mysql_adapter.rb, line 269
def quoted_false
  QUOTED_FALSE
end
quoted_true()
# File activerecord/lib/active_record/connection_adapters/mysql_adapter.rb, line 265
def quoted_true
  QUOTED_TRUE
end
reconnect!()
# File activerecord/lib/active_record/connection_adapters/mysql_adapter.rb, line 305
def reconnect!
  disconnect!
  clear_cache!
  connect
end
release_savepoint()
# File activerecord/lib/active_record/connection_adapters/mysql_adapter.rb, line 491
def release_savepoint
  execute("RELEASE SAVEPOINT #{current_savepoint_name}")
end
rename_table(table_name, new_name)

Renames a table.

Example:

rename_table('octopuses', 'octopi')
# File activerecord/lib/active_record/connection_adapters/mysql_adapter.rb, line 650
def rename_table(table_name, new_name)
  execute "RENAME TABLE #{quote_table_name(table_name)} TO #{quote_table_name(new_name)}"
end
reset!()
# File activerecord/lib/active_record/connection_adapters/mysql_adapter.rb, line 317
def reset!
  if @connection.respond_to?(:change_user)
    # See http://bugs.mysql.com/bug.php?id=33540 -- the workaround way to
    # reset the connection is to change the user to the same user.
    @connection.change_user(@config[:username], @config[:password], @config[:database])
    configure_connection
  end
end
rollback_to_savepoint()
# File activerecord/lib/active_record/connection_adapters/mysql_adapter.rb, line 487
def rollback_to_savepoint
  execute("ROLLBACK TO SAVEPOINT #{current_savepoint_name}")
end
select_rows(sql, name = nil)

DATABASE STATEMENTS ======================================

# File activerecord/lib/active_record/connection_adapters/mysql_adapter.rb, line 328
def select_rows(sql, name = nil)
  @connection.query_with_result = true
  rows = exec_without_stmt(sql, name).rows
  @connection.more_results && @connection.next_result    # invoking stored procedures with CLIENT_MULTI_RESULTS requires this to tidy up else connection will be dropped
  rows
end
show_variable(name)

SHOW VARIABLES LIKE ‘name’

# File activerecord/lib/active_record/connection_adapters/mysql_adapter.rb, line 719
def show_variable(name)
  variables = select_all("SHOW VARIABLES LIKE '#{name}'")
  variables.first['Value'] unless variables.empty?
end
supports_statement_cache?()

Returns true, since this connection adapter supports prepared statement caching.

# File activerecord/lib/active_record/connection_adapters/mysql_adapter.rb, line 210
def supports_statement_cache?
  true
end
table_exists?(name)
# File activerecord/lib/active_record/connection_adapters/mysql_adapter.rb, line 596
def table_exists?(name)
  return true if super

  name          = name.to_s
  schema, table = name.split('.', 2)

  unless table # A table was provided without a schema
    table  = schema
    schema = nil
  end

  tables(nil, schema).include? table
end
type_cast(value, column)
# File activerecord/lib/active_record/connection_adapters/mysql_adapter.rb, line 247
def type_cast(value, column)
  return super unless value == true || value == false

  value ? 1 : 0
end
type_to_sql(type, limit = nil, precision = nil, scale = nil)

Maps logical Rails types to MySQL-specific data types.

# File activerecord/lib/active_record/connection_adapters/mysql_adapter.rb, line 697
def type_to_sql(type, limit = nil, precision = nil, scale = nil)
  return super unless type.to_s == 'integer'

  case limit
  when 1; 'tinyint'
  when 2; 'smallint'
  when 3; 'mediumint'
  when nil, 4, 11; 'int(11)'  # compatibility with MySQL default
  when 5..8; 'bigint'
  else raise(ActiveRecordError, "No integer type has byte size #{limit}")
  end
end
Instance Protected methods
add_column_sql(table_name, column_name, type, options = {})
# File activerecord/lib/active_record/connection_adapters/mysql_adapter.rb, line 781
def add_column_sql(table_name, column_name, type, options = {})
  add_column_sql = "ADD #{quote_column_name(column_name)} #{type_to_sql(type, options[:limit], options[:precision], options[:scale])}"
  add_column_options!(add_column_sql, options)
  add_column_position!(add_column_sql, options)
  add_column_sql
end
add_index_sql(table_name, column_name, options = {})
# File activerecord/lib/active_record/connection_adapters/mysql_adapter.rb, line 826
def add_index_sql(table_name, column_name, options = {})
  index_name, index_type, index_columns = add_index_options(table_name, column_name, options)
  "ADD #{index_type} INDEX #{index_name} (#{index_columns})"
end
add_timestamps_sql(table_name)
# File activerecord/lib/active_record/connection_adapters/mysql_adapter.rb, line 836
def add_timestamps_sql(table_name)
  [add_column_sql(table_name, :created_at, :datetime), add_column_sql(table_name, :updated_at, :datetime)]
end
change_column_sql(table_name, column_name, type, options = {})
# File activerecord/lib/active_record/connection_adapters/mysql_adapter.rb, line 793
def change_column_sql(table_name, column_name, type, options = {})
  column = column_for(table_name, column_name)

  unless options_include_default?(options)
    options[:default] = column.default
  end

  unless options.has_key?(:null)
    options[:null] = column.null
  end

  change_column_sql = "CHANGE #{quote_column_name(column_name)} #{quote_column_name(column_name)} #{type_to_sql(type, options[:limit], options[:precision], options[:scale])}"
  add_column_options!(change_column_sql, options)
  add_column_position!(change_column_sql, options)
  change_column_sql
end
quoted_columns_for_index(column_names, options = {})
# File activerecord/lib/active_record/connection_adapters/mysql_adapter.rb, line 755
def quoted_columns_for_index(column_names, options = {})
  length = options[:length] if options.is_a?(Hash)

  quoted_column_names = case length
  when Hash
    column_names.map {|name| length[name] ? "#{quote_column_name(name)}(#{length[name]})" : quote_column_name(name) }
  when Fixnum
    column_names.map {|name| "#{quote_column_name(name)}(#{length})"}
  else
    column_names.map {|name| quote_column_name(name) }
  end
end
remove_column_sql(table_name, *column_names)
# File activerecord/lib/active_record/connection_adapters/mysql_adapter.rb, line 788
def remove_column_sql(table_name, *column_names)
  columns_for_remove(table_name, *column_names).map {|column_name| "DROP #{column_name}" }
end
remove_index_sql(table_name, options = {})
# File activerecord/lib/active_record/connection_adapters/mysql_adapter.rb, line 831
def remove_index_sql(table_name, options = {})
  index_name = index_name_for_remove(table_name, options)
  "DROP INDEX #{index_name}"
end
remove_timestamps_sql(table_name)
# File activerecord/lib/active_record/connection_adapters/mysql_adapter.rb, line 840
def remove_timestamps_sql(table_name)
  [remove_column_sql(table_name, :updated_at), remove_column_sql(table_name, :created_at)]
end
rename_column_sql(table_name, column_name, new_column_name)
# File activerecord/lib/active_record/connection_adapters/mysql_adapter.rb, line 810
def rename_column_sql(table_name, column_name, new_column_name)
  options = {}

  if column = columns(table_name).find { |c| c.name == column_name.to_s }
    options[:default] = column.default
    options[:null] = column.null
  else
    raise ActiveRecordError, "No such column: #{table_name}.#{column_name}"
  end

  current_type = select_one("SHOW COLUMNS FROM #{quote_table_name(table_name)} LIKE '#{column_name}'")["Type"]
  rename_column_sql = "CHANGE #{quote_column_name(column_name)} #{quote_column_name(new_column_name)} #{current_type}"
  add_column_options!(rename_column_sql, options)
  rename_column_sql
end
translate_exception(exception, message)
# File activerecord/lib/active_record/connection_adapters/mysql_adapter.rb, line 768
def translate_exception(exception, message)
  return super unless exception.respond_to?(:errno)

  case exception.errno
  when 1062
    RecordNotUnique.new(message, exception)
  when 1452
    InvalidForeignKey.new(message, exception)
  else
    super
  end
end