레일즈 (버전 2.3.8, 루비 버전 1.8.7, 관련성이있는 경우)를 사용하여 모든 것이 정상적으로 작동하는 것으로 보입니다. 우리의 MySQL 버전 5.5.20 DBMS의 모든 테이블은 기본 latin-1 charset을 사용하고있었습니다. 우리는 국제 사용자가 없기 때문에 괜찮습니다. (우리 database.yml은 실제로 utf8을 지정하지만 ... 아무도 데이터베이스를 발견하지 못했습니다. 전에는 실제로 그런 식으로 나오지 않았습니다).레일스 마이그레이션이 갑자기 다른 문자셋이있는 테이블을 갑자기 생성하는 것 같습니다
그러나 마지막 응용 프로그램 중 하나 인 특정 데이터베이스의 테이블이 utf8을 사용하고 있음을 발견했습니다. 우리는 이제이 응용 프로그램과 개발 시스템 및 테스트 서버에 추가하고 있습니다. 새로 생성 된 테이블이 어떤 문자 세트로 끝나는 지 완전히 다른 것처럼 보입니다. 금요일에 저는 테스트 서버에 배포했고 그 중 두 테이블은 latin-1을 사용하는 테이블과 utf8을 사용하는 테이블을 만들었습니다. 내 컴퓨터에서는 둘 다 utf8이었습니다. 이 테이블들 사이에 외래 키를 사용하기 때문에 이것은 문제입니다.
fixing charset issues, migrating from one charset to another 등의 많은 정보를 찾았지만 왜 갑자기이 문제가 발생했는지, 그리고 왜 앞뒤로 전환하는지 설명하지 못했습니다. 두 테이블에 대한
마이 그 레이션은
create_table :charges, :id => false do |t|
t.string :id
t.decimal :amount
t.decimal :charge
t.text :description
t.string :charge_type_ref_id
t.string :business_id
t.timestamps
end
및
create_table :charge_type_refs, :id => false do |t|
t.string :id
t.string :name
t.string :code
t.boolean :active
t.decimal :fee
t.timestamps
end
우리의 database.yml을있다가
development:
adapter: mysql
encoding: utf8
reconnect: false
database: database_development
pool: 5
username: username
password: password
socket: /tmp/mysql.sock
내가 이런 일을 중지하기 위해 무엇을 할 수처럼 보인다? 각 마이그레이션에서 charset을 지정하는 데 의존해야하지만, 조금 우스운 것 같습니다. 나는 이것이 정말로 이상한 것처럼 보이기 때문에 왜 이런 일이 일어나고 있는지 정말로 알고 싶다. 이 응용 프로그램에 대해이 데이터베이스를 적용하는 것만으로 나머지 응용 프로그램과 데이터베이스는 모두 동일합니다. 나는 그것을 얻지 않는다.
편집 : 사실 모든 데이터베이스를 자세히 보면 utf8 인 테이블에는 하나 또는 두 개의 테이블이 있습니다. 그래서 문제는 이전에있었습니다. 그 테이블들 사이에 외래 키가 없었기 때문에 우리는 결코 전에 눈치 채지 못했습니다. 우리가 현재 작업하고있는 데이터베이스는 다른 데이터베이스보다 훨씬 큰 영향을 미친 것으로 보입니다. my.cnf 파일에
[mysqld]
character-set-server = utf8
collation-server = utf8_general_ci
를 추가
허용 대답의 솔루션
내 개발 시스템에 완벽하게 일했다. 테이블을 여러 번 다시 만들었고 매번 작동했습니다. 어떤 이유로 테스트 서버에서이 작업을 시도했지만 작동하지 않았습니다. my.cnf의 설정이SHOW VARIABLES LIKE 'char%';
및
SHOW VARIABLES LIKE 'collation%';
의 출력을보고 영향을 미쳤음을 확인했습니다. 모든 변수는 utf8 또는 utf8_general_ci로 설정되었습니다. 그러나 어떻게 든 생성 된 테이블 중 일부는 여전히 latin1에서 나왔습니다. 나는 같은 결과로 여러 번 시도했다.
이 솔루션은 시간이 걸릴 수도 있지만 항상 그런 것은 아닙니다. 기괴한 이유로. 내가 포기하고 우리의 테스트 및 개발 서버에 대한 마이그레이션을 생성하는 모든 테이블에 :options => 'DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci'
을 추가했습니다.
(나는 원래 이것이 내가 처음에 그렇게하지 않은 이유는 레일의 문제라고 생각했다)는 기존 데이터베이스를 들어, 당신이보고있는 것으로 나타났다 지원을 위해 오라클에 연락 후 데이타베이스 고유의 캐릭터 세트/조합 설정 새 테이블을 만들 때 서버 수준 설정보다 우선합니다. 그래서 다른 사람이 이것을 경험한다면, 먼저
ALTER DATABASE databasename CHARACTER SET=utf8;
으로 데이터베이스를 utf8로 재설정해야합니다. my.cnf에 설정을 추가하면 앞으로 새로운 데이터베이스에 대해 이론적으로 올바른 문자 집합으로 만들어집니다.
: 나는 /etc/mysql/my.cnf에서 문자 집합을 설정할 때까지이 문서에 따라 다음과 같은 문제가 있었다 이렇게 듣고 기뻐. 나는 내 마음을 잃어 가고 있다고 생각하기 시작했다. 나는 서버 설정에 대해 읽었지만, 이것으로 무슨 일이 벌어지는 지 알기 전 까진 걱정했다. 고마워, 나는 그것을 시도 할 것이다. 또한 링크에 대한 감사; 과도한 양의 인터넷 검색 결과를 볼 수 없었습니다. – Maltiriel
my.cnf에 설정을 추가 한 후 모든 테이블을 다시 만들려고 했으므로이 작업을 수락 한 것으로 보입니다. utf8_unicode_ci와 함께 모든 테이블이 utf8으로 나옵니다. 감사. – Maltiriel