Unterschied zwischen Zeichenfolge und Text in Schienen?


435

Ich erstelle eine neue Web-App mit Rails und habe mich gefragt, was der Unterschied zwischen stringund ist text. Und wann sollte jeder verwendet werden?

Antworten:


522

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:

http://www.packtpub.com/article/Working-with-Rails-ActiveRecord-Migrations-Models-Scaffolding-and-Database-Completion

Wann sollte jeder verwendet werden?

Als allgemeine Faustregel verwenden Sie :stringfür kurze Texteingaben (Benutzername, E-Mail, Passwort, Titel usw.) und :textfür länger erwartete Eingaben wie Beschreibungen, Kommentarinhalte usw.


11
Ich denke, eine bessere Faustregel ist, immer zu verwenden :text. Siehe depesz.com/2010/03/02/charx-vs-varcharx-vs-varchar-vs-text
Reed G. Law

74
Für MySQL - nicht so sehr, Sie können Indizes für Varchars haben, Sie können nicht für Text.
Omar Qureshi

12
Die PostgreSQL-Implementierung bevorzugt Text. Der einzige Unterschied für pg string / text besteht in der Beschränkung der Länge für string. Keine Leistungsunterschiede.
Andy Bettisworth

Dies scheint bei ActiveRecord nicht die ganze Geschichte zu sein. Durch Speichern des Werts truein einem varchar (ergo, Typfeld string) in MySQL wird der Wert serialisiert 1(was völlig fair ist). textWenn 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?
Peter

1
@ elli0t bedeutet, dass Sie nicht indizieren können. Wenn dies wichtig ist, sollten Sie keinen Text auf MySQL
Omar Qureshi

157

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

PostsgreSQL-Handbuch


4
Aber ist dies der beste Ansatz, um datenbankunabhängig zu sein? Was ist, wenn Sie die Datenbank ändern möchten? Ich gebe zu, in der realen Welt passiert das nicht so oft, aber trotzdem ... wenn es keinen Leistungsunterschied gibt, warum nicht bei der erwarteten Verwendung von Zeichenfolgen für kurze Dinge und Text für längere Dinge bleiben? Und angesichts Ihrer eigenen Indexierungszeichenfolgen für Kommentare scheint dies immer noch der beste Ansatz zu sein.
Dan Barron

6
Es gibt eine Reihe von Gründen, warum dies in der realen Welt notwendig werden könnte, wo es am besten ist, die Vorstellung zu verlieren, dass es für jedes Problem eine wahre Lösung gibt.
Dan Barron

14
Das mag sein, aber Datenbank-Agnostizismus ist ein falscher Prophet.
Omar Qureshi

2
Hat jemand Informationen darüber, ob der Leistungsverlust erheblich ist oder ob es sich um eine vorzeitige Optimierung handelt? Ich vermute, Sie werden nie einen Unterschied bemerken, was die Eröffnung des Absatzes zu bestätigen scheint: "Es gibt keinen Leistungsunterschied zwischen diesen drei Typen".
Dennis

5
Sie machen einen guten Punkt, aber ich bin nicht ganz überzeugt. Die Argumente in diesem Blog-Beitrag für die Verwendung von textOver (n)-Datentypen sind überzeugend, das Argument für die Verwendung von textOver varcharjedoch nicht. Er sagt, dass sie gleich sind, bevorzugt aber, textweil varcharsie verwechselt werden können varchar(n)und weil textweniger Zeichen eingegeben werden müssen. Wenn Sie jedoch textanstelle von verwenden varchar, verlieren Sie den Kontext, dass die gespeicherten Daten nicht lang sein sollten. Zum Beispiel textscheint mir das Speichern eines Benutzernamens mit irreführend.
Dennis

17

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 productskönnte bei der Verwendung textfür viel langsamer sein nameals 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.


12

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


11

Wie oben erläutert, wirkt sich dies nicht nur auf den Datentyp db aus, sondern auch auf die Ansicht, die beim Gerüstbau generiert wird. Zeichenfolge generiert ein text_field Text generiert einen text_area


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.


1

Wenn Sie Orakel verwenden ... STRINGwird als VARCHAR(255)Spalte und TEXTals 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 }
}

https://github.com/rsim/oracle-enhanced/blob/master/lib/active_record/connection_adapters/oracle_enhanced_adapter.rb


1

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

0

Wenn das Attribut f.text_fieldin der Form übereinstimmt , verwenden Sie eine Zeichenfolge . Wenn es übereinstimmt, f.text_areaverwenden Sie Text .

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.