Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Ruby on Rails MySQL #08S01Bad handshake - downgrade MySQL?


Em vez de fazer o downgrade do MySQL gem, é possível corrigir o parâmetro do nome do banco de dados para corrigir o "bad handshake" problema.

Encontrei isto:https://github.com/rubygems/rubygems/issues/423 Está funcionando bem.

Em vez de fazer um hack em real_connect é possível adicionar o "\0" em config/database.yml
production:
  database: "itsalive_production\0"
  adapter: mysql
  host: localhost
  encoding: UTF8
  ...

EDIT
Se você usar a solução com \0 no final do nome do banco de dados. Você provavelmente descobrirá isso e resolverá sozinho, mas eu o mencionei de qualquer maneira:
(pelo menos na minha versão do Rails )
Usando a string do banco de dados com \0 no final dá problema ao fazer rake test . Ele começa com a exclusão do banco de dados de teste antes de copiar as definições do banco de dados de desenvolvimento e, em seguida, usando uma cadeia de comando SQL que inclui o nome do banco de dados de teste. Isso causará um erro por causa do \0 no meio da corda.

No meu caso estou usando um banco de dados de desenvolvimento local que não dá nenhum problema então não preciso ter \0 nesse nome.
Aqui está um hack alternativo para resolver isso (código original em mysql_adapter.rb ):
module ActiveRecord
  module ConnectionAdapters
    class MysqlAdapter

      alias_method :old_execute, :execute

      def execute(sql, name = nil) #:nodoc:
        # This is needed because database names can end with "\0" to fix
        # the issue with "handshake" when mysql server is newer than the gem
        # requires. E.g. called when loading the new test db when doing "rake test".
        sql = sql.delete("\0")

        old_execute(sql, name)
      end
    end
  end
end