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?
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:
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.
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.
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.
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
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
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.
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 }
}
Si l'attribut correspond à f.text_field
dans le formulaire, utilisez string , s'il correspond à f.text_area
, utilisez text .
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