Help us understand the problem. What is going on with this article?

Mysqlデータベースに絵文字を格納する方法

More than 5 years have passed since last update.

絵文字

絵文字とは語(音形)ではなく、ものや事柄を、絵を文字のように用いて象徴的に示唆したもののことです。

Mysqlデータベースに絵文字を格納したい場合はどうすれば良いか

皆さんが存じると思いますが、mysqlのデフォルトの文字コードはUTF-8ですが、
UTF-8のデータベースに絵文字を格納できないです。
絵文字を格納したい場合はmysqlのデータベースの文字コードをutf8mb4に変更する必要です。

Utf8mb4の設定

utf8mb4をサーポートするバージョンは5.5.3+です。
mysqlのmy.confファイルに以下の設定を追加します。

   # my.conf
   [client] 
   default-character-set = utf8mb4
   [mysqld]
   character-set-server = utf8mb4
   collation-server = utf8mb4_unicode_ci
   skip-character-set-client-handshake

mysqlサーバーを再起動して、文字コードをちゃんと反映されたかどうか、確認します。

   mysql> use sample
   Database changed
   mysql> show variables like "char%" ;
   +--------------------------+----------------------------+
   | Variable_name            | Value                      |
   +--------------------------+----------------------------+
   | character_set_client     | utf8mb4                    |
   | character_set_connection | utf8mb4                    |
   | character_set_database   | utf8mb4                    |
   | character_set_filesystem | binary                     |
   | character_set_results    | utf8mb4                    |
   | character_set_server     | utf8mb4                    |
   | character_set_system     | utf8                       |
   | character_sets_dir       | /usr/share/mysql/charsets/ |
   +--------------------------+----------------------------+
   8 rows in set (0.00 sec)

上記のようにcharacter_set_client、character_set_connection、character_set_database、character_set_results、character_set_serverがutf8mb4になったらOKです。

Railsアプリで修正する必要

Railsアプリではデファオルでutf-8文字コードを使うので、utf8mb4を使用するため修正する必要があります。
まず、データベース設定ファイルを修正する。以下のように修正したら、問題なく動くはずです。

   development:
      adapter: mysql2
      charset: utf8mb4
      encoding: utf8mb4
      collation: utf8mb4_unicode_ci
      reconnect: false

Rails 4+場合上記の設定で動けるが、Rails 3以下を使えば、767バイトに制限されるバグがあります。mysqlはデファオルでインデックスキーのバイト数を767バイトに制限します。Utf8場合は1つ文字が3バイトなので、インデックスキーの文字数が最大255文字です。ですが、Utf8mb4では1つ文字が⒋バイトなので、インデックスキーの文字数が最大191文字しかないです。その原因で、Railsアプリでインデックスを貼る時、エラーが出てしまいます。

修正方法はSchemaStatementsとSchemaMigrationをオーバーライドします。

// SchemaStatement

   module ActiveRecord
      module ConnectionAdapters # :nodoc:
         module SchemaStatements
            MAX_INDEX_LENGTH_FOR_UTF8MB4 = 191
            def initialize_schema_migrations_table
               if @config[:encoding] == 'utf8mb4'   
                  ActiveRecord::SchemaMigration.create_table(MAX_INDEX_LENGTH_FOR_UTF8MB4)
               else
                  ActiveRecord::SchemaMigration.create_table
               end
            end
         end
      end
   end
// SchemaMigration

   module ActiveRecord            
      class SchemaMigration < ActiveRecord::Base
         def self.index_name
            "#{Base.table_name_prefix}unique_schema_migrations#{Base.table_name_suffix}"
         end

         def self.create_table(limit=nil)
            unless connection.table_exists?(table_name)
               version_options = {null: false}
               version_options[:limit] = limit if limit

               connection.create_table(table_name, id: false) do |t|
                  t.column :version, :string, version_options
               end
               connection.add_index table_name, :version, unique: true, name: index_name
            end
         end               
      end
   end

そして、インデックスを貼るmigrationファイルに文字列の文字数を修正します。

 add_index :users, :email, unique: true, length: 191
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした