Risposte:
La differenza dipende dal modo in cui il simbolo viene convertito nel rispettivo tipo di colonna nel linguaggio di query.
con MySQL: la stringa è mappata su 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)
Riferimento:
Quando dovrebbero essere usati ciascuno?
Come regola generale, utilizzare :string
per brevi input di testo (nome utente, e-mail, password, titoli, ecc.) E utilizzare :text
per input più lunghi previsti come descrizioni, contenuti dei commenti, ecc.
true
su un varchar (ergo, string
type field) in MySQL serializza il valore su 1
(che è completamente corretto). Tuttavia, sotto text
type, la memorizzazione del valore "true" finisce per serializzarlo come un carattere singolare t
. Ho migrato una colonna senza rendermene conto e tutte le righe future in cui il valore è vero è ora t
. Qualcuno ha qualche idea su questo comportamento?
Se stai usando Postgres usa il testo ovunque tu sia, a meno che tu non abbia un limite di dimensioni poiché non vi è alcuna penalità prestazionale per text vs varchar
Non vi è alcuna differenza di prestazioni tra questi tre tipi, a parte un maggiore spazio di archiviazione quando si utilizza il tipo con riempimento vuoto e alcuni cicli CPU aggiuntivi per controllare la lunghezza durante l'archiviazione in una colonna con vincoli di lunghezza. Sebbene il carattere (n) presenti vantaggi in termini di prestazioni in alcuni altri sistemi di database, PostgreSQL non offre tali vantaggi; infatti il carattere (n) è di solito il più lento dei tre a causa dei suoi costi di archiviazione aggiuntivi. Nella maggior parte dei casi, invece, è necessario utilizzare testo o caratteri diversi
text
più di (n)
tipi di dati sono convincenti, ma l'argomento per l'utilizzo di text
sopra varchar
non è. Dice che sono gli stessi, ma preferisce text
perché varchar
può essere confuso varchar(n)
e perché text
è meno caratteri da digitare. Usando text
invece di varchar
, perdi il contesto in cui i dati memorizzati non dovrebbero essere lunghi. Ad esempio, la memorizzazione di un nome utente con text
mi sembra fuorviante.
String si traduce in "Varchar" nel database, mentre il testo si traduce in "testo". Un varchar può contenere molti meno elementi, un testo può avere (quasi) qualsiasi lunghezza.
Per un'analisi approfondita con buoni riferimenti, consultare http://www.pythian.com/news/7129/text-vs-varchar/
Modifica: alcuni motori di database possono essere caricati varchar
in una volta sola, ma memorizzano il testo (e il BLOB) all'esterno della tabella. A SELECT name, amount FROM products
potrebbe, essere molto più lento quando si utilizza text
per name
rispetto a quando si utilizza varchar
. E poiché Rails, per impostazione predefinita SELECT * FROM...
verranno caricati i record con le colonne di testo. Questo probabilmente non sarà mai un vero problema nella tua o nella mia app (l'ottimizzazione prematura è ...). Ma sapere che il testo non è sempre "libero" è bene sapere.
Stringa se la dimensione è fissa e piccola e testo se è variabile e grande. Questo è molto importante perché il testo è molto più grande delle stringhe. Contiene molti più kilobyte.
Quindi per i campi piccoli usare sempre string (varchar). I campi piacciono. nome, login, e-mail, oggetto (di un articolo o post) ed esempio di testi: contenuto / corpo di un post o articolo. campi per paragrafi ecc
Dimensioni stringa da 1 a 255 (impostazione predefinita = 255)
Dimensioni del testo da 1 a 4294967296 (impostazione predefinita = 65536) 2
Usa una stringa per campi più corti, come nomi, indirizzo, telefono, azienda
Usa il testo per contenuti più grandi, commenti, contenuti, paragrafi.
La mia regola generale, se è qualcosa che è più di una riga, di solito vado per il testo, se sono brevi 2-6 parole, vado per la stringa.
La regola ufficiale è 255 per una stringa. Quindi, se la stringa contiene più di 255 caratteri, cerca il testo.
Se stai usando l'oracolo ... STRING
verrà creato come VARCHAR(255)
colonna e TEXT
, come a 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 }
}
La risposta accettata è fantastica, spiega correttamente la differenza tra stringa e testo (principalmente la dimensione limite nel database, ma ci sono alcuni altri trucchi), ma volevo sottolineare un piccolo problema che mi ha fatto superare come risposta non l'ha fatto completamente per me.
La dimensione massima : limite => 1 a 4294967296 non ha funzionato esattamente come indicato, avevo bisogno di andare -1 da quella dimensione massima. Sto memorizzando grandi BLOB JSON e potrebbero essere pazzi enormi a volte.
Ecco la mia migrazione con il valore maggiore in atto con il valore di cui MySQL non si lamenta.
Nota il 5 alla fine del limite anziché il 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
Se l'attributo corrisponde f.text_field
nel modulo, utilizza la stringa , se corrisponde f.text_area
utilizza il testo .
:text
. Vedi depesz.com/2010/03/02/charx-vs-varcharx-vs-varchar-vs-text