1

モデルの 1 つの属性に割り当てられた文字列を受け取り、それをデータベースに保存するコントローラーがあるというこの問題に直面しています。inspect 呼び出しを含むログ メッセージは、モデルが #save 呼び出しまで文字列を正常に取得していることを示しています。問題は、文字列にフランス語の文字が含まれている場合、エラーがスローされずに、その文字から文字列の末尾までの文字列が切り捨てられることです。

さらに調査すると、MySQL データベースに書き込まれるときに文字列が切り捨てられることが示されているようです。この記事にも出くわしました: Stale Rails Issue

私が正しく読んでいれば、ASCII 文字エンコーディングではなく、ISO Latin-1 文字エンコーディングの文字がこのバグの影響を受けているようです。私は実際に自分のプロジェクトを Rails 3.0 から Rails 3.2 に、Ruby 1.8 から Ruby 1.9 にアップグレードしたので、Rails で mysql2 アダプターを簡単に使用できるようになりました。しかし、そうではありませんでした。

では、文字列の切り捨てが起こらないようにするにはどうすればよいでしょうか?

Edit1:クエリを入力すると、次のようになりますSHOW VARIABLES WHERE Variable_name LIKE 'character\_set\_%' OR Variable_name LIKE 'collation%';

Variable Name, Value
'character_set_client', 'utf8'
'character_set_connection', 'utf8'
'character_set_database', 'utf8'
'character_set_filesystem', 'binary'
'character_set_results', 'utf8'
'character_set_server', 'latin1'
'character_set_system', 'utf8'
'collation_connection', 'utf8_general_ci'
'collation_database', 'utf8_unicode_ci'
'collation_server', 'latin1_swedish_ci'

また、MySQL Query Browser を介してフランス語の文字を配置し、ブラウザで Rails アプリを更新して、表示されるデータベースから新しいデータを取得すると、正しく表示されることに気付きました。モデルデータを保存するときにドロップするようです。

Edit2:問題を解決するためにいくつかの構成パラメーターを変更しましたが、まだ存在しています。ただし、これは私が値を変更したものです。

Variable Name, Value
'character_set_client', 'utf8'
'character_set_connection', 'utf8'
'character_set_database', 'utf8'
'character_set_filesystem', 'binary'
'character_set_results', 'utf8'
'character_set_server', 'utf8'
'character_set_system', 'utf8'
'collation_connection', 'utf8_general_ci'
'collation_database', 'utf8_unicode_ci'
'collation_server', 'utf8_unicode_ci'
4

2 に答える 2

0

ご面倒をおかけしてすみません。答えだけ載せておきます。この場合、データベースは utf8 用に正しく設定されていましたが、ユーザーが ISO-Latin-1 でエンコードされた文字列を入力していたことが判明しました。すべての入力が utf8 互換であると想定していたため、ユーザー入力のエンコーディングをチェックしていませんでした。 . ISO-Latin-1 のフランス語のアクセント文字は不正な utf8 文字であることが判明しました。データベースは、警告を発し、不正な文字のポイントで文字列を切り捨て、その前のすべてを保持するだけで処理しているようです。

于 2015-06-18T22:43:56.853 に答える
0

あなたは使用していますutf8が、それを使用する場合は、より良いパフォーマンスの別utf8_unicode_ciエンコーディングがありutf8_general_ciますが、ドイツ語で問題が発生する可能性がありutf8_unicode_ciます. -unicode-sets . Rails と Ruby については、この質問を確認してください。フランス語のアクセントは ruby​​ にあります。また、フランス語での Rails メッセージも表示されます。最後のリソースとして、データベースに挿入する前にデータを html エンコードできます。これは検索を台無しにする可能性がありますが、データベースを検索する前に検索データをエンコードすると、すべてがうまくいくはずです。詳細については、Rails ページのフランス語の文字を確認してください。. エラーが引き続き発生する場合は、これが役立つことを願っています。他の方法を確認できるよう教えてください。

また、@Ahmed Aliのコメントは、エンコーディングが変更されたように見えるのに役立ちます

データベース (Mysql、Postgresql、Sqlite2 & 3) からデータをフェッチすると、すべて文字セットとして UTF-8 を使用するように構成され、ruby 1.9.1 および rails 2.3.2.1 で ASCII-8BIT のデータが返されます。

完全な回答については Ahmed が投稿したリンクと、引用が取得されたページへのリンクを参照してください (クエリ結果の ASCII-8BIT エンコーディングは rails 2.3.2 および ruby​​ 1.9.1です)。

于 2013-07-12T19:30:55.657 に答える