Rails 4 Migration: Mysql2 :: Fehler: Daten zu lang für Spalte 'xxxx'

7

Hier ist mein schema.rb

%Vor%

Ich habe das Limit für die Zeichenfolge "name" festgelegt.

Dann in der Konsole:

%Vor%

Es hat den Fehler ausgelöst:

%Vor%

Aber als ich zu rails 3 wechselte.

Ich habe festgestellt, dass die Zeichenfolge " 1234567890 " automatisch abgeschnitten und " 123456 " in die Datenbank eingefügt wurde Fehler.

Gibt es etwas, das in rails 4 entfernt wurde?

Sollte ich einige Funktionen im Modell selbst hinzufügen? Danke!

    
tzzzoz 19.06.2014, 15:17
quelle

2 Antworten

16

Was Sie sehen, ist ein Unterschied in MySQL, nicht in Rails. Standardmäßig schneidet MySQL Daten ab, die zu lang sind, anstatt einen Fehler auszulösen. Wenn Sie MySQL auf den strict -Modus einstellen, werden Fehler ausgelöst, anstatt Daten stillschweigend zu kürzen.

Mit Version 4 aktiviert Rails standardmäßig den strikten Modus . Aus diesem Grund sehen Sie bei Rails 3 ein anderes Verhalten. Dieses ist das Verhalten, das Sie wahrscheinlich möchten. Das stille Abschneiden von Daten ist fast immer schlecht und kann zu einem sehr verwirrenden Verhalten der Benutzer führen.

Wenn Sie wirklich möchten, dass die Daten abgeschnitten werden, könnten Sie schalte den strikten Modus aus oder verwende einen before-Filter:

%Vor%     
James Mason 19.06.2014, 17:51
quelle
7

Ich stolperte über diesen Artikel , der zufällig erst vor ein paar Tagen geschrieben wurde.

>

Der wichtigste Punkt von Interesse ist dies:

  

... Ich habe kürzlich von Rails 3.2 auf Rails 4.0 aufgerüstet. Sie implementierten ein   größere Änderung mit ActiveRecords, die ich nicht erwähnen kann   wo außer im Quell- und Änderungsprotokoll.

     
  • mysql und mysql2 Verbindungen werden standardmäßig auf SQL_MODE=STRICT_ALL_TABLES gesetzt, um einen stillen Datenverlust zu vermeiden.   Dies kann durch Angabe von strict: false in Ihrem System deaktiviert werden    database.yml .
  •   

Dies würde erklären, warum Sie den Fehler bei der Rückkehr zu Rails 3 nicht mehr erhalten haben. Sie können dies in den Optionen von MySQL-Verbindungsadaptermodul , und es sieht so aus, als wäre es hinzugefügt im Mai 2012 für den 4.1.2 Release Candidate (wenn ich die Tags richtig lese).

Diese Person löste ihr Problem mit ... [fixing] code, um entweder die richtigen Feldlängen zu haben oder die Daten manuell zu kürzen ... .

In Ihrem Fall können Sie möglicherweise Ihr Problem in Rails 4 lösen, indem Sie einfach strict: false in Ihrem database.yml hinzufügen. Wenn Sie anpassen möchten, wie die Daten abgeschnitten werden, stimme ich dem Vorschlag von JKen13579 über den before_save -Rückruf zu. Ansonsten, von dem, was ich sehen kann, scheint es, die rechtesten Zeichen abzuschneiden, wenn das ausreicht, können Sie wahrscheinlich mit dem Standardkürzungsverhalten durchkommen.

    
Paul Richter 19.06.2014 17:50
quelle