2009-06-04 4 views
4

레이크 작업을 사용하여 MS Access의 일부 기존 데이터를 MySQL로 마이그레이션하려고합니다. Windows XP에서 Ruby 1.8.6을 사용하고 있습니다.MySQL의 "잘못된 문자열 값"오류를 피하기 위해 데이터를 어떻게 처리 할 수 ​​있습니까?

레일스에 대한 인코딩이 database.yml에 "utf8"으로 설정되어 있습니다.

또한 MySQL의 기본 문자 집합은 utf8입니다.

는 데이터의

99 %가 잘오고 하지만 때때로 나는 나에게 이런 오류 뭔가 제공하는 열 값을 얻을 것이다 :

Mysql::Error: Incorrect string value: '\x92 Comm...' for column 'name' 
    at row 1: 
    INSERT INTO `organizations` ([...]) 
    VALUES('Lawyers’ Committee', [...]) 

그것은주고 것은 것처럼 보이는을 MySQL 문제는 "변호사"라는 단어의 "s"바로 뒤에 오는 아포스트로피입니다.

여기는 "TM"에 질식처럼

Mysql::Error: Incorrect string value: '\x99 aoc' for column 'department' 
    at row 1: 
    INSERT INTO `addresses` 
[...] 
    'TRInfo™ aoc' 
[....] 

는 "TRInfo"후 같은데 ... 또 다른 하나입니다.

MySQL에서 질식 할 문자를 정화하기 위해 데이터를 실행할 수있는 Ruby 또는 Rails 메서드가 있습니까?

가장 이상적인 문자로 대체하는 것이 이상적입니다. 아포스트로피를 작은 따옴표로 바꾸고 TM 기호를 "TM"으로 바꾸는 것이 좋습니다.

또는 오류를 발생시키지 않고 그대로 문자를 저장하도록 MySQL을 구성 할 수 있다면 좋을 것입니다.

답변

5

입력 된 데이터가 utf-8이 아닌 것 같습니다.

나는 약간의 조사를했고 변호사의 스타일 인용문은 Windows-1252 인코딩에서 \ x92로 인코딩되었지만 utf-8에서는 말도 안 될 것입니다 (디코딩하여 utf8로 인코딩 할 때 \ xe2 \ x80 \ x99).

따라서 입력 문자열을 windows-1252에서 utf-8 (또는 유니 코드)으로 변환해야합니다.

+3

이 솔루션은 OP 질문에 "어떤 방법이 있습니까?"라고 대답하지 않습니다. – Gary

0

이전 데이터베이스가 하나의 문자열 형식 (utf8?)이고 레일이 다른 것을 기대하고있는 것처럼 보입니다. 입력 한 내용이 utf8 인 경우 시도했습니다. configuring your rails to support it?

+0

감사를 사용하는 경우, 모든 것이 UTF8로 설정됩니다. – Ethan

1

보통 16 비트 블록 당 한 문자를 저장하는 UTF-16 인코딩 파일의 내용을 java가있는 mysql 테이블에 넣을 때도 동일한 문제가있었습니다. 문제는 UTF-16으로 인코딩 된 문자열이 이라는 surrogate pair이라는 것을 포함한다는 것입니다. 이것은 두 개의 16 비트 UTF-16 블록이 하나의 특수 문자를 인코딩하지만 해당 UTF-8 인코딩으로 개별적으로 변환 될 수 없다는 것을 의미합니다. 자세한 설명은 wikipedia을 참조하십시오.

해결 방법은 단순히 이러한 문자를 공백으로 대체하는 것이 었습니다. 문자열에서 제외하려는 문자 범위입니다. U + D800-U + DFFF

1

일반적으로 호환되지 않는 인코딩/데이터 정렬을 사용하여 열을 문자열에 삽입하면이 문제가 발생합니다.

어떤 이유에서든 서버의 데이터 정렬을 상속받은 TRIGGER가있을 때이 오류가 발생했습니다. 그리고 mysql의 기본값은 (적어도 Ubuntu에서는) latin-1이며 swedish 데이터 정렬을 사용합니다.

/etc/mysql/my.cnf : 내가 데이터베이스와 UTF-8로 설정 모든 테이블을했다하더라도, 나는 my.cnf 설정 아직했다

[mysqld] 
character-set-server=utf8 
default-character-set=utf8 

을 그리고 이것은 UTF8 모든 트리거를 나열해야합니다 - *

select TRIGGER_SCHEMA, TRIGGER_NAME, CHARACTER_SET_CLIENT, COLLATION_CONNECTION, DATABASE_COLLATION from information_schema.TRIGGERS 

또한 UTF-8을 * (1 번 라틴 또는 다른 인코딩)이 없어야한다으로 나열된 일부 변수 :

show variables like 'char%'; 
0
 
I encountered the same problem today. 
After tried many times, I found out the reason and fix it at last. 
For applications that store data using the default MySQL character set and collation (latin1, latin1_swedish_ci), so you need to specify the character set and collation to utf8/utf8_general_ci when your create your database or table. 
e.g.: 
     $sql = "CREATE TABLE " . $table_name . " (
     id mediumint(9) NOT NULL AUTO_INCREMENT, 
     bookname varchar(128) NOT NULL, 
     author varchar(64) NOT NULL, 
     PRIMARY KEY (id), 
     KEY (bookname) 
     )CHARACTER SET utf8 COLLATE utf8_general_ci;"; 

Reference: 
《mysql create table problem? SOLVED!!!!!!!!!!!》 
http://forums.mysql.com/read.php?121,193883,193883 
《10.1.5. Configuring the Character Set and Collation for Applications》 
http://dev.mysql.com/doc/refman/5.0/en/charset-applications.html 

Hoping this can help you. 
0

이상한 칼럼이 문제를 해결하기 전에 이진을 추가하십시오.

필자의 경우, 다른 테이블에 데이터를 삽입하기 위해 tableA에 대한 업데이트 트리거가 있습니다. 일부 특수 문자가 열 weirdcolumn에 있습니다. "ERROR 1366 (HY000) : 잘못된 문자열 값 : '\ xE7 ....'"

많은 것을 파고 들자 나는 발견했습니다. 문자열 열 이름 앞에 binary를 추가하거나 cast (weirdcolumn as binary)를 사용하여 해결합니다.

희망이 도움이 될 수 있습니다.

0

PHP를 사용하여 SQL Server에서 MySql으로 데이터를 가져 오는 것과 동일한 문제가있었습니다. 내 솔루션은 MySql에 삽입 할 때 utf8_encode()이고 브라우저에 표시하려면 MySql에서 검색 할 때 utf8_decode()을 사용합니다. 여기에 좋은 코드가 있습니다.

//For string values 
$Gro2=(is_null($row["GrpNm"]))?"NULL":"\"".mysql_escape_string(utf8_encode($row["GrpNm"]))."\""; 


$sqlMy ="INSERT INTO `tbl_name` VALUES ($Gro2)"; 

참고 : 새로운 프로젝트가

mysqli_escape_string() 

link