Antworten:
Der Unterschied besteht darin, wie das Symbol in der Abfragesprache in seinen jeweiligen Spaltentyp konvertiert wird.
mit MySQL: Zeichenfolge wird VARCHAR (255) zugeordnet - http://guides.rubyonrails.org/migrations.html
:string | VARCHAR | :limit => 1 to 255 (default = 255)
:text | TINYTEXT, TEXT, MEDIUMTEXT, or LONGTEXT2 | :limit => 1 to 4294967296 (default = 65536)
Referenz:
Wann sollte jeder verwendet werden?
Als allgemeine Faustregel verwenden Sie :string
für kurze Texteingaben (Benutzername, E-Mail, Passwort, Titel usw.) und :text
für länger erwartete Eingaben wie Beschreibungen, Kommentarinhalte usw.
true
in einem varchar (ergo, Typfeld string
) in MySQL wird der Wert serialisiert 1
(was völlig fair ist). text
Wenn Sie jedoch unter type den Wert "true" speichern, wird er als einzelnes Zeichen serialisiert t
. Ich habe eine Spalte migriert, ohne dies zu bemerken, und alle zukünftigen Zeilen, in denen der Wert wahr ist, sind jetzt t
. Hat jemand irgendwelche Einblicke in dieses Verhalten?
Wenn Sie Postgres verwenden, verwenden Sie Text, wo immer Sie können, es sei denn, Sie haben eine Größenbeschränkung, da es keine Leistungseinbußen für Text gegenüber Varchar gibt
Es gibt keinen Leistungsunterschied zwischen diesen drei Typen, abgesehen von erhöhtem Speicherplatz bei Verwendung des mit Leerzeichen aufgefüllten Typs und einigen zusätzlichen CPU-Zyklen zur Überprüfung der Länge beim Speichern in einer Spalte mit eingeschränkter Länge. Während Zeichen (n) in einigen anderen Datenbanksystemen Leistungsvorteile bietet, gibt es in PostgreSQL keinen solchen Vorteil. Tatsächlich ist Zeichen (n) aufgrund seiner zusätzlichen Speicherkosten normalerweise das langsamste der drei. In den meisten Situationen sollten stattdessen unterschiedliche Texte oder Zeichen verwendet werden
text
Over (n)
-Datentypen sind überzeugend, das Argument für die Verwendung von text
Over varchar
jedoch nicht. Er sagt, dass sie gleich sind, bevorzugt aber, text
weil varchar
sie verwechselt werden können varchar(n)
und weil text
weniger Zeichen eingegeben werden müssen. Wenn Sie jedoch text
anstelle von verwenden varchar
, verlieren Sie den Kontext, dass die gespeicherten Daten nicht lang sein sollten. Zum Beispiel text
scheint mir das Speichern eines Benutzernamens mit irreführend.
String wird in Ihrer Datenbank in "Varchar" übersetzt, während Text in "Text" übersetzt wird. Ein Varchar kann weit weniger Elemente enthalten, ein Text kann (fast) beliebig lang sein.
Eine eingehende Analyse mit guten Referenzen finden Sie unter http://www.pythian.com/news/7129/text-vs-varchar/.
Bearbeiten: Einige Datenbankmodule können auf einmal geladen werden varchar
, speichern jedoch Text (und Blob) außerhalb der Tabelle. A SELECT name, amount FROM products
könnte bei der Verwendung text
für viel langsamer sein name
als bei der Verwendung varchar
. Und seit Rails werden standardmäßig Datensätze mit SELECT * FROM...
Ihren Textspalten geladen. Dies wird jedoch wahrscheinlich nie ein echtes Problem in Ihrer oder meiner App sein (vorzeitige Optimierung ist ...). Aber zu wissen, dass Text nicht immer "frei" ist, ist gut zu wissen.
Zeichenfolge, wenn die Größe fest und klein ist, und Text, wenn sie variabel und groß ist. Dies ist wichtig, da Text viel größer als Zeichenfolgen ist. Es enthält viel mehr Kilobyte.
Verwenden Sie für kleine Felder immer string (varchar). Felder wie. Vorname, Login, E-Mail, Betreff (eines Artikels oder Beitrags) und Beispiel für Texte: Inhalt / Text eines Beitrags oder Artikels. Felder für Absätze usw.
Zeichenfolgengröße 1 bis 255 (Standard = 255)
Textgröße 1 bis 4294967296 (Standard = 65536) 2
Verwenden Sie eine Zeichenfolge für kürzere Felder wie Namen, Adresse, Telefon, Firma
Verwenden Sie Text für größere Inhalte, Kommentare, Inhalte und Absätze.
Meine allgemeine Regel: Wenn es sich um mehr als eine Zeile handelt, greife ich normalerweise zu Text. Wenn es sich um kurze 2-6 Wörter handelt, greife ich zu einer Zeichenfolge.
Die offizielle Regel ist 255 für eine Zeichenfolge. Wenn Ihre Zeichenfolge mehr als 255 Zeichen umfasst, wählen Sie Text.
Wenn Sie Orakel verwenden ... STRING
wird als VARCHAR(255)
Spalte und TEXT
als CLOB
.
NATIVE_DATABASE_TYPES = {
primary_key: "NUMBER(38) NOT NULL PRIMARY KEY",
string: { name: "VARCHAR2", limit: 255 },
text: { name: "CLOB" },
ntext: { name: "NCLOB" },
integer: { name: "NUMBER", limit: 38 },
float: { name: "BINARY_FLOAT" },
decimal: { name: "DECIMAL" },
datetime: { name: "TIMESTAMP" },
timestamp: { name: "TIMESTAMP" },
timestamptz: { name: "TIMESTAMP WITH TIME ZONE" },
timestampltz: { name: "TIMESTAMP WITH LOCAL TIME ZONE" },
time: { name: "TIMESTAMP" },
date: { name: "DATE" },
binary: { name: "BLOB" },
boolean: { name: "NUMBER", limit: 1 },
raw: { name: "RAW", limit: 2000 },
bigint: { name: "NUMBER", limit: 19 }
}
Die akzeptierte Antwort ist fantastisch, sie erklärt den Unterschied zwischen Zeichenfolge und Text (meistens die Grenzgröße in der Datenbank, aber es gibt ein paar andere Fallstricke), aber ich wollte auf ein kleines Problem hinweisen, das mich als Antwort durchgebracht hat habe es nicht ganz für mich getan.
Die maximale Größe : limit => 1 bis 4294967296 funktionierte nicht genau wie angegeben, ich musste von dieser maximalen Größe auf -1 gehen. Ich speichere große JSON-Blobs und sie können manchmal verrückt groß sein.
Hier ist meine Migration mit dem größeren Wert, über den sich MySQL nicht beschwert.
Beachten Sie die 5 am Ende des Limits anstelle von 6
class ChangeUserSyncRecordDetailsToText < ActiveRecord::Migration[5.1]
def up
change_column :user_sync_records, :details, :text, :limit => 4294967295
end
def down
change_column :user_sync_records, :details, :string, :limit => 1000
end
end
Wenn das Attribut f.text_field
in der Form übereinstimmt , verwenden Sie eine Zeichenfolge . Wenn es übereinstimmt, f.text_area
verwenden Sie Text .
:text
. Siehe depesz.com/2010/03/02/charx-vs-varcharx-vs-varchar-vs-text