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.
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
(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.
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
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!
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
Ajouter ou modifier le contenu suivant
config/database.yml
charset: utf8mb4
encoding: utf8mb4
collation: utf8mb4_general_ci
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.
Réinitialisez le DB → migrez pour refléter les paramètres du DB jusqu'à présent.
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!
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