[RUBY] [Rails5.2] Prise en charge des pictogrammes de Mysql 5.7 dans Docker (changez le code de caractère en utf8mb4)

introduction

Je suis un débutant en Rails créant un portfolio avec Ruby on Rails. Cette fois, comme le titre l'indique, il s'agit d'un mémorandum lorsque mysql pour enregistrer les informations de pictogramme dans la table est défini sur utf8mb4.

** J'ai eu une erreur en essayant d'enregistrer un titre vidéo à partir de l'API de données Youtube. ** **

ActiveRecord::StatementInvalid in VideosController#refresh
Mysql2::Error: Incorrect string value: '\xF0\x9F\x94\xB5\xE8\x87...'

Il y a quelques titres avec des pictogrammes, ce qui semble avoir causé une erreur. En regardant le code de caractère de db sur mysql, c'est uft8, et il semble que cela doive être changé ... Pour le moment, je l'ai implémenté comme suit en référence à différents codes.

environnement

Je développe des Rails dans un conteneur à l'aide de Docker pour mac.

ruby 2.4.5
mysql 5.7.31
Ruby on rails 5.0.7.2

couler

(Préparation: vidage)

  1. Modifiez my.cnf
  2. Redémarrez mysql
  3. Ajouter des options à ActiveRecord
  4. Modifiez database.yml
  5. Modifiez docker-compose.yml et redémarrez le conteneur
  6. Exécutez db: migrate: reset
  7. Restaurer les données de vidage

Préparation: vidage

Je ne connaissais pas le mot dump jusqu'à ce que je fasse ce travail en premier lieu, mais il semble que ** dump ** consiste à afficher les informations dans la table DB sous la forme de SQL. (À propos, la dernière restauration consiste à mettre les informations sauvegardées dans la base de données)

Puisque nous allons modifier les paramètres de la base de données cette fois et changer le code de caractère de chaque table en utf8mb4, nous prendrons la forme de déposer temporairement les données sous forme de fichier et de les saisir après avoir modifié les paramètres.

Utilisez la gemme suivante pour faciliter le vidage / la restauration.

Gemfile


gem 'yaml_db'

Cette fois, nous utiliserons yaml_db, un joyau qui génère un fichier au format yaml sous forme de vidage. GitHub - yamldb/yaml_db

Pour vider, vous pouvez exécuter la commande suivante

Terminal


bundle exec rails db:data:dump

Après avoir exécuté la commande, le fichier est envoyé vers db / data.yml. Comme ceci, le nom de la table, les informations de colonne et l'enregistrement sont affichés dans cet ordre.

data.yml


videos:
  columns:
  - id
  - name
  - url
  - upload_at
  - created_at
  - updated_at
  records:
  - - 1
    - "[Impact] Une entreprise qui décide du montant du paiement du bonus par questionnaire"
    - https://www.youtube.com/watch?v=42ofwfioMFM
    - 2020-10-09 09:00:00.000000000 Z
    - 2020-10-10 08:07:38.000000000 Z
    - 2020-10-10 08:07:38.000000000 Z
 :

La préparation est OK ci-dessous.

1. Modifiez my.cnf

Définissez le fichier my.cnf comme suit. Je voulais comprendre ce qui était écrit, alors je l'ai regardé ligne par ligne.

my.cnf


[mysql]
default-character-set=utf8mb4 #Réglage du code de caractère

[mysqld] #Paramètres du serveur mysqld Mysql
character-set-server = utf8mb4 #Réglage du code de caractère
skip-character-set-client-handshake #Pour ignorer le code de caractère spécifié côté client
collation-server = utf8mb4_general_ci #Spécifier l'ordre de tri
init-connect = SET NAMES utf8mb4 #Spécification du jeu de caractères utilisé pour l'envoi du client au serveur

Examinons de plus près chaque élément.

[mysql] et [mysqld] mysqld est le programme principal chargé de diverses opérations dans mysql, également appelé serveur MySQL. Puisque l'opération côté mysql est toujours effectuée à partir de ce mysqld, divers paramètres sont requis ici.

skip-character-set-client-handshake character-set-client-handshake est l'acte de refléter le code de caractère du côté client du côté MySQL. En sautant ceci, vous pouvez définir sur uft8mb4.

collation-server = utf8mb4_general_ci le classement est le classement: ordre de tri. Défini pour chaque mot séparé par _. Voir ci-dessous pour plus de détails [MySQL] Qu'est-ce que le classement?

init-connect = SET NAMES utf8mb4 Spécification du code de caractère utilisé pour l'envoi du client au serveur Voir ci-dessous pour plus de détails 10.1.4 Jeu de caractères de connexion et classement

2. Redémarrez mysql

Pour l'instant, redémarrez mysql pour que ce paramètre prenne effet. Entrez le conteneur dans Docker et exécutez la commande suivante.

Vérifiez les paramètres d'origine pour le moment

terminal


mysql>status;
:(Omission)
Server characterset:	utf8
Db     characterset:	utf8
Client characterset:	utf8
Conn.  characterset:	utf8
:

C'est utf8. Alors, redémarrez-le et réessayez.

terminal


mysql>service mysql restart

terminal


mysql>status
:(Omission)
Server characterset:	utf8mb4
Db     characterset:	utf8mb4
Client characterset:	utf8mb4
Conn.  characterset:	utf8mb4
:

J'ai pu le mettre!

3. Ajouter des options à ActiveRecord

Ensuite, lorsque Create_table d'ActiveRecord est exécuté, définissez-le pour s'enregistrer à l'aide de utf8mb4.

Créez un nouveau config / initializers / utf8mb4.rb et écrivez le code suivant. Lorsque vous remplissez la configuration / les initialiseurs avec un fichier, il sera chargé par défaut avant le démarrage de Rails.

config/initializers/utf8mb4.rb


#module pour définir l'option
module Utf8mb4
  def create_table(table_name, options = {})
    table_options = options.merge(options: 'ENGINE=InnoDB ROW_FORMAT=DYNAMIC')
    super(table_name, table_options) do |td|
      yield td if block_given?
    end
  end
end

ActiveSupport.on_load :active_record do
  module ActiveRecord::ConnectionAdapters
    class AbstractMysqlAdapter
      #Exécutez d'abord le module utf8mb4, puis exécutez les méthodes existantes(super)      
      prepend Utf8mb4
    end
  end
end

4. Modifiez database.yml

Ajouter ou modifier le contenu suivant

config/database.yml


  charset: utf8mb4
  encoding: utf8mb4
  collation: utf8mb4_general_ci

5. Modifiez docker-compose.yml

Modifiez le fichier de paramètres Docker comme suit.

docker-compose.yml


:
  db:
    image: mysql:5.7
    command: mysqld --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci #Définir utf8mb4
    container_name:Nom du conteneur
    volumes:
      - ./my.cnf:/etc/mysql/conf.d/my.cnf #my.Définir pour lire cnf
 :

Dans cet état, redémarrez le conteneur une fois.

6. Exécutez db: migrate: reset

Réinitialisez le DB → migrez pour refléter les paramètres du DB jusqu'à présent.

7. Restaurer les données de vidage

Enfin, saisissez à nouveau les données sauvegardées au début et vous avez terminé. Vous pouvez le restaurer avec la commande suivante.

terminal


rails db:data:load

Ceci termine les réglages!

À la fin

J'ai défini divers paramètres, mais c'était une bonne étude car j'ai pu connaître les fonctions telles que le vidage.

** Sites qui ont servi de référence ** Merci beaucoup···! ・ Changer le codage MySQL de utf8 à utf8mb4 pour résoudre le problème de la bière de sushi

Recommended Posts

[Rails5.2] Prise en charge des pictogrammes de Mysql 5.7 dans Docker (changez le code de caractère en utf8mb4)
Comment installer Docker dans l'environnement local d'une application Rails existante [Rails 6 / MySQL 8]
Pour ceux qui souhaitent utiliser MySQL pour la base de données dans la construction de l'environnement de Rails6 ~.
Résumé des procédures de développement dans un conteneur Docker avec VS Code
[Rails] Comment changer le titre de la page du navigateur pour chaque page
Comment changer le nom de l'application dans les rails
Déployer sur heroku avec Docker (Rails 6, MySQL)
Prise en charge des erreurs gdb dans les conteneurs Docker
Comment utiliser MySQL dans le didacticiel Rails
Paramètres japonais pour mysql dans le conteneur Docker
Modifiez la destination d'enregistrement de l'image en S3 dans l'application Rails. Partie 2
Procédure pour introduire Docker dans l'environnement de développement des applications Rails existantes [Rails, MySQL, Docker]
Exemple de code pour obtenir les valeurs de type SQL clés dans Java + MySQL 8.0
Comment utiliser JQuery dans Rails 6 js.erb
Résumé des commandes fréquemment utilisées dans Rails et Docker
Changer la date et l'heure en notation japonaise dans Rails
SSL dans l'environnement local de Docker / Rails / puma
[Ruby on Rails] De la construction de MySQL au changement de base de données
Comment spécifier le code de caractère et le code de saut de ligne avec JAXB
Comment définir le code de caractère et le code de saut de ligne dans Eclipse
Éléments à prendre en compte lors de l'écriture de code en Java
Le code de sortie 1 se produit lorsque Rails est arrêté dans l'environnement Docker
[Rails] Où faire attention dans la description de la validation
Comment changer la couleur d'arrière-plan de la barre de navigation, etc. dans Swift UI
Procédure de migration de l'environnement de développement d'applications Rails vers Docker même si vous êtes inexpérimenté (Rails5 + MySQL8.0 + docker-compose)
[Docker] Comment sauvegarder et restaurer les données de base de données de l'application Rails sur docker-compose [MySQL]