Ich bin ein Rails-Anfänger und erstelle mit Ruby on Rails ein Portfolio. Dieses Mal ist es, wie der Titel schon sagt, ein Memorandum, wenn MySQL zum Speichern von Piktogramminformationen in der Tabelle auf utf8mb4 gesetzt ist.
** Beim Versuch, einen Videotitel über die Youtube-Daten-API zu speichern, ist eine Fehlermeldung aufgetreten. ** ** **
ActiveRecord::StatementInvalid in VideosController#refresh
Mysql2::Error: Incorrect string value: '\xF0\x9F\x94\xB5\xE8\x87...'
Es gibt einige Titel mit Piktogrammen, die einen Fehler verursacht zu haben scheinen. Wenn man den Zeichencode von db auf MySQL betrachtet, ist es uft8, und es scheint, dass dies geändert werden muss ... Vorerst habe ich es wie folgt unter Bezugnahme auf verschiedene Codes implementiert.
Ich entwickle Rails in einem Container mit Docker für Mac.
ruby 2.4.5
mysql 5.7.31
Ruby on rails 5.0.7.2
(Vorbereitung: Dump)
Ich kannte das Wort dump nicht, bis ich diese Arbeit überhaupt gemacht habe, aber es scheint, dass ** dump ** die Informationen in der DB-Tabelle in Form von SQL ausgeben soll. (Übrigens besteht die letzte Wiederherstellung darin, die ausgegebenen Informationen in die Datenbank zu stellen.)
Da wir diesmal die Datenbankeinstellungen ändern und den Zeichencode jeder Tabelle in utf8mb4 ändern, werden die Daten vorübergehend als Datei gelöscht und nach Änderung der Einstellungen eingegeben.
Verwenden Sie den folgenden Edelstein, um das Speichern / Wiederherstellen zu vereinfachen.
Gemfile
gem 'yaml_db'
Dieses Mal verwenden wir yaml_db, ein Juwel, das eine Datei im yaml-Format als Dump ausgibt. GitHub - yamldb/yaml_db
Zum Speichern können Sie den folgenden Befehl ausführen
Terminal
bundle exec rails db:data:dump
Nach dem Ausführen des Befehls wird die Datei in "db / data.yml" ausgegeben. Auf diese Weise werden der Tabellenname, die Spalteninformationen und der Datensatz in dieser Reihenfolge ausgegeben.
data.yml
videos:
columns:
- id
- name
- url
- upload_at
- created_at
- updated_at
records:
- - 1
- "[Auswirkung] Ein Unternehmen, das die Höhe der Bonuszahlung per Quiz festlegt"
- 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
:
Die Vorbereitung ist unten in Ordnung.
Stellen Sie die Datei my.cnf wie folgt ein. Ich wollte verstehen, was geschrieben stand, also schaute ich es Zeile für Zeile an.
my.cnf
[mysql]
default-character-set=utf8mb4 #Zeichencodeeinstellung
[mysqld] #mysqld MySQL-Servereinstellungen
character-set-server = utf8mb4 #Zeichencodeeinstellung
skip-character-set-client-handshake #Zum Ignorieren des auf der Clientseite angegebenen Zeichencodes
collation-server = utf8mb4_general_ci #Festlegen der Sortierreihenfolge
init-connect = SET NAMES utf8mb4 #Zeichensatzspezifikation zum Senden vom Client zum Server
Schauen wir uns jeden Artikel genauer an.
[mysql] und [mysqld]
mysqld ist das Hauptprogramm, das für verschiedene Operationen in mysql zuständig ist, auch MySQL-Server genannt.
Da die Operation auf der MySQL-Seite immer von dieser MySQL-Seite aus ausgeführt wird, sind hier verschiedene Einstellungen erforderlich.
skip-character-set-client-handshake
Zeichensatz-Client-Handshake ist der Vorgang, bei dem der Zeichencode auf der Clientseite auf der MySQL-Seite wiedergegeben wird. Wenn Sie dies überspringen, können Sie uft8mb4 einstellen.
collation-server = utf8mb4_general_ci
Kollatierung ist Kollatierung: Sortierreihenfolge. Stellen Sie für jedes durch _ getrennte Wort ein.
Siehe unten für Details
[MySQL] Was ist Kollatierung?
init-connect = SET NAMES utf8mb4
Angabe des Zeichencodes, der zum Senden vom Client an den Server verwendet wird
Siehe unten für Details
10.1.4 Verbindungszeichensatz und Sortierung
Starten Sie MySQL vorerst neu, damit diese Einstellung wirksam wird. Geben Sie den Container in Docker ein und führen Sie den folgenden Befehl aus.
Überprüfen Sie vorerst die ursprünglichen Einstellungen
terminal
mysql>status;
:(Unterlassung)
Server characterset: utf8
Db characterset: utf8
Client characterset: utf8
Conn. characterset: utf8
:
Es ist utf8. Starten Sie es also neu und versuchen Sie es erneut.
terminal
mysql>service mysql restart
terminal
mysql>status
:(Unterlassung)
Server characterset: utf8mb4
Db characterset: utf8mb4
Client characterset: utf8mb4
Conn. characterset: utf8mb4
:
Ich konnte es einstellen!
Wenn Create_table of ActiveRecord ausgeführt wird, setzen Sie es als Nächstes mit utf8mb4 auf Registrierung.
Erstellen Sie eine neue config / initializers / utf8mb4.rb
und schreiben Sie den folgenden Code.
Wenn Sie config / initializers mit einer Datei füllen, wird diese standardmäßig geladen, bevor Rails gestartet wird.
config/initializers/utf8mb4.rb
#Modul zum Einstellen der 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
#Führen Sie zuerst das Modul utf8mb4 und dann die vorhandenen Methoden aus(super)
prepend Utf8mb4
end
end
end
Fügen Sie die folgenden Inhalte hinzu oder ändern Sie sie
config/database.yml
charset: utf8mb4
encoding: utf8mb4
collation: utf8mb4_general_ci
Ändern Sie die Docker-Einstellungsdatei wie folgt.
docker-compose.yml
:
db:
image: mysql:5.7
command: mysqld --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci #Setze utf8mb4
container_name:Containername
volumes:
- ./my.cnf:/etc/mysql/conf.d/my.cnf #my.Zum Lesen von cnf einstellen
:
Starten Sie in diesem Zustand den Container einmal neu.
Setzen Sie die Datenbank zurück → migrieren Sie, um die bisherigen Einstellungen für die Datenbank widerzuspiegeln.
Geben Sie die ausgegebenen Daten zu Beginn erneut ein, und Sie sind fertig. Sie können es mit dem folgenden Befehl wiederherstellen.
terminal
rails db:data:load
Damit sind die Einstellungen abgeschlossen!
Ich habe verschiedene Einstellungen vorgenommen, aber es war eine gute Studie, weil ich die Funktionen wie Dump kennen konnte.
** Websites, die als Referenz verwendet wurden ** Vielen Dank···! ・ Ändern Sie die MySQL-Codierung von utf8 in utf8mb4, um das Problem mit Sushi-Bier zu lösen
Recommended Posts