2012-06-06 2 views
0

나는 마이 그 레이션을 실행하려고 시도 할 때마다 "UTF-8로 잘못된 바이트 시퀀스"오류가 발생합니다. 나는 내가 번들 간부를 사용하는 데 필요한 메시지를 얻으려면, rake db:migrate을 실행하면레일 마이그레이션 "UTF-8에서의 유효하지 않은 바이트 시퀀스"

class ChangeSchoolEmailToApplicationEmail < ActiveRecord::Migration 
    def self.up 
    rename_column :users, :school_email, :application_email 
    end 

    def self.down 
    rename_column :users, :application_email, :school_email 
    end 
end 

: 여기 마이그레이션입니다. 그래서 결국 사용하는 명령은 다음과 같은 오류가 발생하는 bundle exec rake db:migrate입니다 :

C:\Rails\qsn>bundle exec rake db:migrate 
== ChangeSchoolEmailToApplicationEmail: migrating ============================ 
-- rename_column(:users, :school_email, :application_email) 
rake aborted! 
An error has occurred, this and all later migrations canceled: 

invalid byte sequence in UTF-8 

Tasks: TOP => db:migrate 
(See full trace by running task with --trace) 

도움말 감사합니다!

편집 : --trace으로 출력이 보이는 같은 :

C:\Rails\qsn>bundle exec rake db:migrate --trace 
** Invoke db:migrate (first_time) 
** Invoke environment (first_time) 
** Execute environment 
** Execute db:migrate 
== ChangeSchoolEmailToApplicationEmail: migrating ============================ 
-- rename_column(:users, :school_email, :application_email) 
rake aborted! 
An error has occurred, this and all later migrations canceled: 

invalid byte sequence in UTF-8 
C:/Ruby/lib/ruby/gems/1.9.1/gems/sqlite3-1.3.4-x86-mingw32/lib/sqlite3/database.rb:48:in `gsub' 
C:/Ruby/lib/ruby/gems/1.9.1/gems/sqlite3-1.3.4-x86-mingw32/lib/sqlite3/database.rb:48:in `quote' 
C:/Ruby/lib/ruby/gems/1.9.1/gems/activerecord-3.0.9/lib/active_record/connection_adapters/sqlite_adapter.rb:114:in `quote_string' 
C:/Ruby/lib/ruby/gems/1.9.1/gems/activerecord-3.0.9/lib/active_record/connection_adapters/abstract/quoting.rb:21:in `quote' 
C:/Ruby/lib/ruby/gems/1.9.1/gems/activerecord-3.0.9/lib/active_record/connection_adapters/sqlite3_adapter.rb:45:in `quote' 
C:/Ruby/lib/ruby/gems/1.9.1/gems/activerecord-3.0.9/lib/active_record/connection_adapters/sqlite_adapter.rb:372:in `block (2 levels) in copy_table_con 
tents' 
C:/Ruby/lib/ruby/gems/1.9.1/gems/activerecord-3.0.9/lib/active_record/connection_adapters/sqlite_adapter.rb:372:in `map' 
C:/Ruby/lib/ruby/gems/1.9.1/gems/activerecord-3.0.9/lib/active_record/connection_adapters/sqlite_adapter.rb:372:in `block in copy_table_contents' 
C:/Ruby/lib/ruby/gems/1.9.1/gems/sqlite3-1.3.4-x86-mingw32/lib/sqlite3/database.rb:142:in `block (2 levels) in execute' 
C:/Ruby/lib/ruby/gems/1.9.1/gems/sqlite3-1.3.4-x86-mingw32/lib/sqlite3/statement.rb:110:in `block in each' 
C:/Ruby/lib/ruby/gems/1.9.1/gems/sqlite3-1.3.4-x86-mingw32/lib/sqlite3/statement.rb:107:in `loop' 
C:/Ruby/lib/ruby/gems/1.9.1/gems/sqlite3-1.3.4-x86-mingw32/lib/sqlite3/statement.rb:107:in `each' 
C:/Ruby/lib/ruby/gems/1.9.1/gems/sqlite3-1.3.4-x86-mingw32/lib/sqlite3/database.rb:140:in `block in execute' 
C:/Ruby/lib/ruby/gems/1.9.1/gems/sqlite3-1.3.4-x86-mingw32/lib/sqlite3/database.rb:95:in `prepare' 
C:/Ruby/lib/ruby/gems/1.9.1/gems/sqlite3-1.3.4-x86-mingw32/lib/sqlite3/database.rb:134:in `execute' 
C:/Ruby/lib/ruby/gems/1.9.1/gems/activerecord-3.0.9/lib/active_record/connection_adapters/sqlite_adapter.rb:370:in `copy_table_contents' 
C:/Ruby/lib/ruby/gems/1.9.1/gems/activerecord-3.0.9/lib/active_record/connection_adapters/sqlite_adapter.rb:334:in `copy_table' 
C:/Ruby/lib/ruby/gems/1.9.1/gems/activerecord-3.0.9/lib/active_record/connection_adapters/sqlite_adapter.rb:311:in `move_table' 
C:/Ruby/lib/ruby/gems/1.9.1/gems/activerecord-3.0.9/lib/active_record/connection_adapters/sqlite_adapter.rb:304:in `block in alter_table' 
C:/Ruby/lib/ruby/gems/1.9.1/gems/activerecord-3.0.9/lib/active_record/connection_adapters/abstract/database_statements.rb:139:in `transaction' 
C:/Ruby/lib/ruby/gems/1.9.1/gems/activerecord-3.0.9/lib/active_record/connection_adapters/sqlite_adapter.rb:303:in `alter_table' 
C:/Ruby/lib/ruby/gems/1.9.1/gems/activerecord-3.0.9/lib/active_record/connection_adapters/sqlite_adapter.rb:275:in `rename_column' 
C:/Ruby/lib/ruby/gems/1.9.1/gems/activerecord-3.0.9/lib/active_record/migration.rb:385:in `block in method_missing' 
C:/Ruby/lib/ruby/gems/1.9.1/gems/activerecord-3.0.9/lib/active_record/migration.rb:361:in `block in say_with_time' 
C:/Ruby/lib/ruby/1.9.1/benchmark.rb:295:in `measure' 
C:/Ruby/lib/ruby/gems/1.9.1/gems/activerecord-3.0.9/lib/active_record/migration.rb:361:in `say_with_time' 
C:/Ruby/lib/ruby/gems/1.9.1/gems/activerecord-3.0.9/lib/active_record/migration.rb:381:in `method_missing' 
C:/Rails/qsn/db/migrate/20120606013213_change_school_email_to_application_email.rb:3:in `up' 
C:/Ruby/lib/ruby/gems/1.9.1/gems/activerecord-3.0.9/lib/active_record/migration.rb:314:in `block in migrate' 
C:/Ruby/lib/ruby/1.9.1/benchmark.rb:295:in `measure' 
C:/Ruby/lib/ruby/gems/1.9.1/gems/activerecord-3.0.9/lib/active_record/migration.rb:314:in `migrate' 
C:in `migrate' 
C:/Ruby/lib/ruby/gems/1.9.1/gems/activerecord-3.0.9/lib/active_record/migration.rb:539:in `block (2 levels) in migrate' 
C:/Ruby/lib/ruby/gems/1.9.1/gems/activerecord-3.0.9/lib/active_record/migration.rb:613:in `call' 
C:/Ruby/lib/ruby/gems/1.9.1/gems/activerecord-3.0.9/lib/active_record/migration.rb:613:in `block in ddl_transaction' 
C:/Ruby/lib/ruby/gems/1.9.1/gems/activerecord-3.0.9/lib/active_record/connection_adapters/abstract/database_statements.rb:139:in `transaction' 
C:/Ruby/lib/ruby/gems/1.9.1/gems/activerecord-3.0.9/lib/active_record/transactions.rb:207:in `transaction' 
C:/Ruby/lib/ruby/gems/1.9.1/gems/activerecord-3.0.9/lib/active_record/migration.rb:613:in `ddl_transaction' 
C:/Ruby/lib/ruby/gems/1.9.1/gems/activerecord-3.0.9/lib/active_record/migration.rb:538:in `block in migrate' 
C:/Ruby/lib/ruby/gems/1.9.1/gems/activerecord-3.0.9/lib/active_record/migration.rb:525:in `each' 
C:/Ruby/lib/ruby/gems/1.9.1/gems/activerecord-3.0.9/lib/active_record/migration.rb:525:in `migrate' 
C:/Ruby/lib/ruby/gems/1.9.1/gems/activerecord-3.0.9/lib/active_record/migration.rb:435:in `up' 
C:/Ruby/lib/ruby/gems/1.9.1/gems/activerecord-3.0.9/lib/active_record/migration.rb:417:in `migrate' 
C:/Ruby/lib/ruby/gems/1.9.1/gems/activerecord-3.0.9/lib/active_record/railties/databases.rake:142:in `block (2 levels) in <top (required)>' 
C:/Ruby/lib/ruby/gems/1.9.1/gems/rake-0.9.2/lib/rake/task.rb:205:in `call' 
C:/Ruby/lib/ruby/gems/1.9.1/gems/rake-0.9.2/lib/rake/task.rb:205:in `block in execute' 
C:/Ruby/lib/ruby/gems/1.9.1/gems/rake-0.9.2/lib/rake/task.rb:200:in `each' 
C:/Ruby/lib/ruby/gems/1.9.1/gems/rake-0.9.2/lib/rake/task.rb:200:in `execute' 
C:/Ruby/lib/ruby/gems/1.9.1/gems/rake-0.9.2/lib/rake/task.rb:158:in `block in invoke_with_call_chain' 
C:/Ruby/lib/ruby/1.9.1/monitor.rb:201:in `mon_synchronize' 
C:/Ruby/lib/ruby/gems/1.9.1/gems/rake-0.9.2/lib/rake/task.rb:151:in `invoke_with_call_chain' 
C:/Ruby/lib/ruby/gems/1.9.1/gems/rake-0.9.2/lib/rake/task.rb:144:in `invoke' 
C:/Ruby/lib/ruby/gems/1.9.1/gems/rake-0.9.2/lib/rake/application.rb:112:in `invoke_task' 
C:/Ruby/lib/ruby/gems/1.9.1/gems/rake-0.9.2/lib/rake/application.rb:90:in `block (2 levels) in top_level' 
C:/Ruby/lib/ruby/gems/1.9.1/gems/rake-0.9.2/lib/rake/application.rb:90:in `each' 
C:/Ruby/lib/ruby/gems/1.9.1/gems/rake-0.9.2/lib/rake/application.rb:90:in `block in top_level' 
C:/Ruby/lib/ruby/gems/1.9.1/gems/rake-0.9.2/lib/rake/application.rb:129:in `standard_exception_handling' 
C:/Ruby/lib/ruby/gems/1.9.1/gems/rake-0.9.2/lib/rake/application.rb:84:in `top_level' 
C:/Ruby/lib/ruby/gems/1.9.1/gems/rake-0.9.2/lib/rake/application.rb:62:in `block in run' 
C:/Ruby/lib/ruby/gems/1.9.1/gems/rake-0.9.2/lib/rake/application.rb:129:in `standard_exception_handling' 
C:/Ruby/lib/ruby/gems/1.9.1/gems/rake-0.9.2/lib/rake/application.rb:59:in `run' 
C:/Ruby/lib/ruby/gems/1.9.1/gems/rake-0.9.2/bin/rake:32:in `<top (required)>' 
C:/Ruby/lib/ruby/gems/1.9.1/bin/rake:19:in `load' 
C:/Ruby/lib/ruby/gems/1.9.1/bin/rake:19:in `<main>' 
Tasks: TOP => db:migrate 

편집 :

school_email의 유형은 String입니다.

또한 오류가 데이터베이스의 문제로 인한 것일 수도 있습니다. 예를 들어, 어떻게 든 부분적으로 손상 될 수 있습니까? 데이터베이스 유형은 SQLite3입니다.

+0

'--trace' 옵션의 출력은 어떻게됩니까? – sarnold

답변

2

SQLite (이름 바꾸기를 지원하지 않음)에서 열의 이름을 바꿀 때 테이블을 다시 만들어야하고 데이터를 다시 삽입해야합니다. 분명히 현재 가지고있는 일부 데이터는 UTF-8로 인코딩되지 않았습니다. 가장 가능성있는 이유는 데이터 손상입니다. 그러나 UTF-8 규칙에 예외가 있어도 이상한 상황에서 이러한 데이터가 전달 될지 여부는 확실하지 않습니다.

당신은 마이그레이션을 수행하기 전에 데이터를 수정, 그래서 유효하지 않은 데이터를 검색 할 시도하고 해결해야합니다 :에,

User.all.each do |user| 
    email = user.school_email 
    email.force_encoding "utf-8" 
    unless email.valid_encoding? 
    puts "Invalid email: #{email} in user id: #{user.id}" 
    email.encode!("utf-8", "utf-8", :invalid => :replace) 
    user.update_attribute(:school_email, email) 
    end 
end 

을 그것은 전적으로 가능 유효하지 않은 데이터가 이메일 필드에없는 것을 이 경우 각 문자열 필드에 대해 비슷한 것을해야 범인을 결정할 수 있습니다.

+0

감사. 테이블에는 여러 개의 열이 있으며 테스트 데이터 일뿐입니다. 테이블을 비우고 빈 테이블에서 마이그레이션을 다시 실행하기로 결정했는데 완벽하게 작동했습니다. – John

관련 문제