2009-06-04 6 views
4

私はRakeタスクを使用して、MS AccessからMySQLにいくつかのレガシーデータを移行しようとしています。私はWindows XPでRuby 1.8.6を使って作業しています。データを処理して、MySQLの「不正な文字列値」エラーを回避する方法はありますか?

私はdatabase.ymlに "utf8"として設定されたRailsのエンコードを持っています。

また、MySQLのデフォルトの文字セットはutf8です。

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

それは与えている事あるかのように見えます:データは罰金に来ているが、すべての今して、私は私にこのようなエラーに何かを与える列の値を取得しますの

99% 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ではないようです。

Lawyer'sで使われているスタイルの引用符はWindows-1252エンコーディングで\ x92としてエンコードされていますが、utf-8ではナンセンスになります(デコードしてutf8にエンコードすると、 xe2 \ x80 \ x99)。

したがって、入力文字列をwindows-1252からutf-8(またはユニコード)に変換する必要があります。

+3

このソリューションは、OPの質問に "何か方法はありますか?" – Gary

0

古いデータベースが1つの文字列形式(utf8?)で、あなたのレールが別のものを期待しているようです。入力がutf8の場合、試してみましたconfiguring your rails to support it?

+0

感謝を使用するために、すべてがUTF8に設定されています。 – Ethan

1

通常、16ビットブロックあたり1文字を格納するUTF-16エンコードファイルの内容をjavaのmysqlテーブルに入れても同じ問題がありました。問題は、というサロゲートペアと呼ばれるUTF-16でエンコードされた文字列が含まれていることでした。つまり、2つの連続する16ビットUTF-16ブロックが1つの特殊文字をエンコードしますが、対応する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
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に更新トリガがあります。 カラム欄にいくつかの特殊文字があり、「ERROR 1366(HY000):不正な文字列値: '\ xE7 ....」と表示されました。

文字列の列名の前にバイナリを追加するか、またはキャスト(バイナリとしてのirdcolumn)を使用して解決します。

これは役に立ちます。

0

私は、SQL ServerからMySqlへのデータをPhpを使用してインポートするのと同じ問題がありました。 私の解決策は、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

関連する問題