[RUBY] [Rails5.2] Unterstützung für Piktogramme von MySQL 5.7 in Docker (Zeichencode in utf8mb4 ändern)

Einführung

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.

Umgebung

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

fließen

(Vorbereitung: Dump)

  1. Ändern Sie my.cnf
  2. Starten Sie MySQL neu
  3. Fügen Sie ActiveRecord Optionen hinzu
  4. Ändern Sie database.yml
  5. Ändern Sie docker-compose.yml und starten Sie den Container neu
  6. Führen Sie db: migrate: reset aus
  7. Stellen Sie die Speicherauszugsdaten wieder her

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.

1. Ändern Sie my.cnf

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

2. Starten Sie MySQL neu

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!

3. Fügen Sie ActiveRecord Optionen hinzu

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

4. Ändern Sie database.yml

Fügen Sie die folgenden Inhalte hinzu oder ändern Sie sie

config/database.yml


  charset: utf8mb4
  encoding: utf8mb4
  collation: utf8mb4_general_ci

5. Ändern Sie docker-compose.yml

Ä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.

6. Führen Sie db: migrate: reset aus

Setzen Sie die Datenbank zurück → migrieren Sie, um die bisherigen Einstellungen für die Datenbank widerzuspiegeln.

7. Stellen Sie die Speicherauszugsdaten wieder her

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!

Am Ende

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

[Rails5.2] Unterstützung für Piktogramme von MySQL 5.7 in Docker (Zeichencode in utf8mb4 ändern)
So installieren Sie Docker in der lokalen Umgebung einer vorhandenen Rails-App [Rails 6 / MySQL 8]
Für diejenigen, die MySQL für die Datenbank in der Umgebungskonstruktion von Rails6 ~ verwenden möchten.
Zusammenfassung der Verfahren zum Entwickeln in einem Docker-Container mit VS-Code
[Schienen] So ändern Sie den Seitentitel des Browsers für jede Seite
So ändern Sie den App-Namen in Rails
Mit Docker auf Heroku bereitstellen (Rails 6, MySQL)
Unterstützung für GDB-Fehler in Docker-Containern
Verwendung von MySQL im Rails-Tutorial
Japanische Einstellungen für MySQL im Docker-Container
Ändern Sie das Speicherziel des Bildes in der Rails-App in S3. Teil 2
Verfahren zum Einführen von Docker in die Entwicklungsumgebung vorhandener Rails-Apps [Rails, MySQL, Docker]
Beispielcode zum Abrufen der wichtigsten SQL-Typwerte in Java + MySQL 8.0
Verwendung von JQuery in Rails 6 js.erb
Zusammenfassung der häufig verwendeten Befehle in Rails und Docker
Ändern Sie Datum und Uhrzeit in Rails in japanische Notation
SSL in der lokalen Umgebung von Docker / Rails / Puma
[Ruby on Rails] Von der MySQL-Konstruktion zum Datenbankwechsel
So legen Sie mit JAXB Zeichencode und Zeilenvorschubcode fest
So legen Sie den Zeichencode und den Zeilenvorschubcode in Eclipse fest
Dinge, die Sie beim Schreiben von Code in Java beachten sollten
Der Exit-Code 1 tritt auf, wenn Rails in der Docker-Umgebung gestoppt wird
[Rails] Bei der Beschreibung der Validierung ist Vorsicht geboten
So ändern Sie die Hintergrundfarbe der Navigationsleiste usw. in der Swift-Benutzeroberfläche
Vorgehensweise zum Migrieren der Rails-Anwendungsentwicklungsumgebung zu Docker, auch wenn Sie unerfahren sind (Rails5 + MySQL8.0 + Docker-Compose)
[Docker] So sichern und wiederherstellen Sie DB-Daten der Rails-Anwendung auf Docker-Compose [MySQL]