sql >> Databasteknik >  >> RDS >> PostgreSQL

Ändra en kolumntyp till längre strängar i skenor

Du bör använda text med Rails om du vill ha en sträng utan längdbegränsning. En migrering som denna:

def up
  change_column :your_table, :your_column, :text
end
def down
  # This might cause trouble if you have strings longer
  # than 255 characters.
  change_column :your_table, :your_column, :string
end

borde reda ut saker. Du kanske vill ha :null => false eller några andra alternativ i slutet av det också.

När du använder en string kolumn utan en explicit gräns kommer Rails att lägga till en implicit :limit => 255 . Men om du använder text , får du vilken godtycklig längd strängtyp som databasen stöder. PostgreSQL låter dig använda en varchar kolumn utan längd men de flesta databaser använder en separat typ för det och Rails känner inte till varchar utan längd. Du måste använda text i Rails för att få en text kolumn i PostgreSQL. Det finns ingen skillnad i PostgreSQL mellan en kolumn av typen text och en av typen varchar (men varchar(n) är annorlunda). Dessutom, om du distribuerar ovanpå PostgreSQL, finns det ingen anledning att använda :string (AKA varchar ) överhuvudtaget behandlar databasen text och varchar(n) samma internt förutom de extra längdbegränsningarna för varchar(n); du bör bara använda varchar(n) (AKA :string ) om du har en extern begränsning (som ett myndighetsformulär som säger att fält 432 på formulär 897/B kommer att vara 23 tecken långt) på kolumnstorleken.

För övrigt om du använder en string var som helst, bör du alltid ange :limit som en påminnelse till dig själv om att det finns en gräns och du bör ha en validering i modellen för att säkerställa att gränsen inte överskrids. Om du överskrider gränsen kommer PostgreSQL att klaga och göra ett undantag, MySQL kommer tyst att trunkera strängen eller klaga (beroende på serverkonfigurationen), SQLite låter den passera som den är och andra databaser kommer att göra något annat (förmodligen klaga) .

Dessutom bör du också utveckla, testa och distribuera ovanpå samma databas (som vanligtvis kommer att vara PostgreSQL på Heroku), du bör till och med använda samma versioner av databasservern. Det finns andra skillnader mellan databaser (såsom beteendet hos GROUP BY) som ActiveRecord inte isolerar dig från. Du kanske gör det här redan men jag tänkte nämna det ändå.

Uppdatera :Nyare versioner av ActiveRecord förstår varchar utan en gräns så, med PostgreSQL åtminstone, kan du säga:

change_column :your_table, :your_column, :string, limit: nil

för att ändra en varchar(n) kolumn till varchar . text och varchar är fortfarande samma sak när det gäller PostgreSQL men vissa formbyggare kommer att behandla dem annorlunda:varchar får en <input type="text"> medan text får en flerrads <textarea> .



  1. Python &MySql:Unicode och kodning

  2. MySQL-handledning – Hantera MySQL-serverloggar:Rotera, komprimera, behålla och ta bort

  3. Hur extraherar man ett numeriskt värde från en sträng i en MySQL-fråga?

  4. Datamaskering i DB-applikationer