web-dev-qa-db-ja.com

Mysql2 :: Error:不正な文字列値

Rails本番モードで実行中のアプリケーションがありますが、ユーザーがレコードを保存しようとしたときに突然このエラーが発生しました。

Mysql2::Error: Incorrect string value

詳細(実動ログから):

Parameters: {"utf8"=>"â<9c><93>" ... 

Mysql2::Error: Incorrect string value: '\xC5\x99\xC3\xA1k 

Mysql2::Error: Incorrect string value: '\xC5\x99\xC3\xA1k 

データベースを削除して再作成する必要があるいくつかのソリューションを見ましたが、それはできません。

現在、mysqlはこれを示しています。

mysql> show variables like 'char%';
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | utf8                       |
| character_set_connection | utf8                       |
| character_set_database   | latin1                     |
| character_set_filesystem | binary                     |
| character_set_results    | utf8                       |
| character_set_server     | latin1                     |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.04 sec)

何が問題で、どのように変更すればキャラクターに問題が生じないのですか?

また、この問題はjavascriptで解決できますか?送信する前に変換しますか?

ありがとう

55
Trt Trt

この問題は、mysqlサーバー側の文字セットが原因です。次のように手動で構成できます。

ALTER TABLE your_database_name.your_table CONVERT TO CHARACTER SET utf8

または、テーブルを削除して、次のように再作成します。

rake db:drop
rake db:create
rake db:migrate

参照:

https://stackoverflow.com/a/18498210/2034097

https://stackoverflow.com/a/16934647/2034097

[〜#〜] update [〜#〜]

最初のコマンドは指定されたテーブルにのみ影響します。データベース内のすべてのテーブルを変更する場合は、次のようにできます。

ALTER DATABASE databasename CHARACTER SET utf8 COLLATE utf8_general_ci;

参照:

https://stackoverflow.com/a/6115705/2034097

73
Chuanpin Zhu

私はこれを ブログ投稿 に従って絵文字(4バイトを占める)を保存することができました。

Rails 4、MySQL、および絵文字(Mysql2::Error: Incorrect string value error.

文字セットがutf-8であることを指定した場合、ほとんどのutf8データをmysqlに安全に挿入できると考えるかもしれません。残念ながら、あなたは間違っているでしょう。問題は、utf8文字セットがVARCHAR列に格納されると バイト を占有することです。一方、絵文字は4バイトを占めます。

ソリューションは2つの部分に分かれています。

テーブルとフィールドのエンコードを変更します。

ALTER TABLE `[table]` 
  CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_bin,
MODIFY [column] VARCHAR(250)
    CHARACTER SET utf8mb4 COLLATE utf8mb4_bin

mysql2アダプタにそれについて伝えます。

development:
  adapter: mysql2
  database: db
  username: 
  password:
  encoding: utf8mb4
  collation: utf8mb4_unicode_ci

これが誰かを助けることを願っています!

その後、アプリを再起動する必要があり、機能しました。一部の絵文字はこの修正なしで機能しますが、機能しないものもあります。

  • work️うまくいきました
  • ????上記の修正プログラムを適用するまで機能しませんでした。
41
Besi

次のような移行を使用して、テーブルをutf8に変換できます。

class ConvertTablesToUtf8 < ActiveRecord::Migration
  def change_encoding(encoding,collation)
    connection = ActiveRecord::Base.connection
    tables = connection.tables
    dbname =connection.current_database
    execute <<-SQL
      ALTER DATABASE #{dbname} CHARACTER SET #{encoding} COLLATE #{collation};
    SQL
    tables.each do |tablename|
      execute <<-SQL
        ALTER TABLE #{dbname}.#{tablename} CONVERT TO CHARACTER SET #{encoding} COLLATE #{collation};
      SQL
    end
  end

  def change
    reversible do |dir|
      dir.up do
        change_encoding('utf8','utf8_general_ci')
      end
      dir.down do
        change_encoding('latin1','latin1_swedish_ci')
      end
    end
  end
end
23
mfazekas

絵文字を保存するには、次のものが必要です。

1)移行を作成します(@mfazekasに感謝)

class ConvertTablesToUtf8 < ActiveRecord::Migration
  def change_encoding(encoding,collation)
    connection = ActiveRecord::Base.connection
    tables = connection.tables
    dbname =connection.current_database
    execute <<-SQL
      ALTER DATABASE #{dbname} CHARACTER SET #{encoding} COLLATE #{collation};
    SQL
    tables.each do |tablename|
      execute <<-SQL
        ALTER TABLE #{dbname}.#{tablename} CONVERT TO CHARACTER SET #{encoding} COLLATE #{collation};
      SQL
    end
  end

  def change
    reversible do |dir|
      dir.up do
        change_encoding('utf8mb4','utf8mb4_bin')
      end
      dir.down do
        change_encoding('latin1','latin1_swedish_ci')
      end
    end
  end
end

2)Rails charsetをutf8mb4に変更します(@ selvamani-pに感謝)

production:
  encoding: utf8mb4

参照:

https://stackoverflow.com/a/39465494/1058096

https://stackoverflow.com/a/26273185/1058096

2
dtelaroli

変える必要がある CHARACTER SETおよびCOLLATEは、すでに作成されたデータベースの場合:

ALTER DATABASE databasename CHARACTER SET utf8 COLLATE utf8_unicode_ci;

または、事前に設定されたパラメーターを使用してデータベースを作成する必要がありました。

CREATE DATABASE databasename CHARACTER SET utf8 COLLATE utf8_general_ci;
1
shilovk

また、データベース構造を変更したくない場合は、問題のフィールドをシリアル化することで選択できます。

class MyModel < ActiveRecord::Base
  serialize :content

  attr_accessible :content, :title
end
0
Paul Marclay

データベースからデータを取得する際のエンコードの問題のようです。以下をdatabase.ymlファイルに追加してみてください

   encoding: utf8 

これで問題が解決することを願っています

0
Dhepthi

ちょうどこれに出くわし、@ mfazekasの答えに感謝します。移行では2つの変更を行いました。1つはconnection.current_databaseからの削除に対応するため(少なくともRails 5)、およびMySQLを使用しない場合はSQLステートメントをスキップする機能です(まだ使用しています) SQLiteは開発中ですが、実行するには移行が必要です)。

class ConvertTablesToUtf8 < ActiveRecord::Migration[5.2]
  def change_encoding(encoding,collation)
    # Allow for different adapter in different environment
    return unless ActiveRecord::Base.connection_config[:adapter] == "mysql"
    tables = connection.tables
    dbname = ActiveRecord::Base.connection_config[:database]
    execute <<-SQL
      ALTER DATABASE #{dbname} CHARACTER SET #{encoding} COLLATE #{collation};
    SQL
    tables.each do |tablename|
    execute <<-SQL
      ALTER TABLE #{dbname}.#{tablename} CONVERT TO CHARACTER SET #{encoding} COLLATE #{collation};
    SQL
    end
  end

  def change
    reversible do |dir|
      dir.up do
        change_encoding('utf8','utf8_general_ci')
      end
      dir.down do
        change_encoding('latin1','latin1_swedish_ci')
      end
    end
  end
end
0
mrturtle