web-dev-qa-db-fra.com

Différence entre la chaîne et le texte dans les rails?

Je crée une nouvelle application Web avec Rails et je me demandais quelle était la différence entre string et text? Et quand faut-il utiliser chacun?

406
Mo.

La différence réside dans la conversion du symbole dans son type de colonne respectif dans le langage de requête.

avec MySQL: la chaîne est mappée à VARCHAR (255) - 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)

Référence:

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

Quand faut-il utiliser chacun?

En règle générale, utilisez :string pour la saisie de texte court (nom d'utilisateur, email, mot de passe, titres, etc.) et :text pour une saisie plus longue, telle que descriptions, contenu de commentaires, etc.

490
TJ Koblentz

Si vous utilisez postgres, utilisez du texte partout où vous le pouvez, sauf si vous avez une contrainte de taille car il n'y a aucune pénalité de performance pour le texte vs varchar.

Il n'y a pas de différence de performances entre ces trois types, mis à part un espace de stockage accru lorsque vous utilisez le type complété par des blancs et quelques cycles d'UC supplémentaires pour vérifier la longueur lors du stockage dans une colonne de longueur limitée. Alors que character (n) présente des avantages en termes de performances sur d’autres systèmes de base de données, il n’existe aucun avantage de ce type dans PostgreSQL; En fait, le caractère (n) est généralement le plus lent des trois en raison de ses coûts de stockage supplémentaires. Dans la plupart des cas, il est préférable d'utiliser du texte ou des caractères variables.

Manuel PostsgreSQL

147
Omar Qureshi

String se traduit par "Varchar" dans votre base de données, tandis que le texte est traduit par "text". Un varchar peut contenir beaucoup moins d'éléments, un texte peut être (presque) de n'importe quelle longueur.

Pour une analyse approfondie avec de bonnes références, consultez http://www.pythian.com/news/7129/text-vs-varchar/

Edit: Certains moteurs de base de données peuvent charger varchar en une fois, mais stocker le texte (et le blob) en dehors de la table. Un SELECT name, amount FROM products peut être beaucoup plus lent lorsque vous utilisez text pour name que lorsque vous utilisez varchar. Et comme Rails charge par défaut les enregistrements avec SELECT * FROM..., vos colonnes de texte seront chargées. Cela ne sera probablement jamais un problème réel dans votre application ou dans mon application, cependant (l'optimisation précoce est ...). Mais savoir que le texte n'est pas toujours "gratuit" est bon à savoir.

17
berkes

Comme expliqué ci-dessus, pas seulement le type de données db, cela affectera également la vue qui sera générée si vous effectuez un échafaudage. string générera un text_field text générera une text_area 

11
ajet

Chaîne si la taille est fixe et petite et texte si elle est variable et grande ..__ C'est un peu important car le texte est beaucoup plus gros que les chaînes. Il contient beaucoup plus de kilo-octets. 

Donc, pour les petits champs, utilisez toujours string (varchar). Les champs aiment. prenom, login, email, objet (d'un article ou d'un article) et exemple de textes: contenu/corps d'un article ou d'un article. champs pour les paragraphes, etc.

Taille de chaîne 1 à 255 (valeur par défaut = 255) 

Taille du texte 1 à 4294967296 (par défaut = 65536) 2

11
Gurudath BN

Utilisez une chaîne pour un champ plus court, comme des noms, adresse, téléphone, société

Utilisez Texte pour un contenu, des commentaires, un contenu et des paragraphes plus volumineux.

Ma règle générale, si c’est quelque chose qui a plus d’une ligne, j’utilise généralement le texte, s’il s’agit de 2 à 6 mots, c’est la chaîne.

La règle officielle est 255 pour une chaîne. Donc, si votre chaîne compte plus de 255 caractères, optez pour le texte.

1
user2012677

Si vous utilisez Oracle ... STRING sera créé en tant que colonne VARCHAR(255) et TEXT, en tant que 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

0
Luis

Si l'attribut correspond à f.text_field dans le formulaire, utilisez string , s'il correspond à f.text_area, utilisez text .

0
CodingBingo

La réponse acceptée est géniale, elle explique correctement la différence entre chaîne et texte (principalement la taille limite dans la base de données, mais il y a quelques autres pièges), mais je voulais signaler un petit problème qui m'a permis de traverser cette réponse. ne l'a pas complètement fait pour moi.

La taille maximale (limite => 1 à 4294967296 ne fonctionnait pas exactement comme elle avait été mise, il me fallait aller à -1 à partir de cette taille maximale. Je stocke de gros blobs JSON et ils peuvent être énormes parfois.

Voici ma migration avec la plus grande valeur en place avec la valeur dont MySQL ne se plaint pas.

Notez le 5 à la fin de la limite au lieu de 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
nategurutech