Mostrando entradas con la etiqueta string. Mostrar todas las entradas
Mostrando entradas con la etiqueta string. Mostrar todas las entradas

sábado, 30 de agosto de 2025

String o Text en columnas de migraciones de Laravel

 ¿Cuál es la diferencia entre string y text en el Blueprint de una migration?

Esta pregunta aborda un concepto fundamental en la gestión de bases de datos con Laravel. La diferencia entre string y text en una migración de Laravel es crucial y tiene un impacto directo en el rendimiento y el almacenamiento de tu base de datos.


La diferencia principal

La distinción principal entre ambos tipos de datos es la longitud máxima del campo:

  • $table->string('nombre_columna', longitud): Crea una columna de tipo VARCHAR en la mayoría de las bases de datos. VARCHAR es ideal para cadenas de texto cortas o medianas (como nombres, correos electrónicos, títulos de artículos, etc.) y requiere que especifiques una longitud máxima. Por defecto, si no la especificas, Laravel le asigna una longitud de 255 caracteres.

  • $table->text('nombre_columna'): Crea una columna de tipo TEXT (o MEDIUMTEXT en MySQL) y está diseñada para almacenar cadenas de texto muy largas (como el cuerpo de un artículo, descripciones detalladas, etc.). La gran diferencia es que no requiere una longitud máxima y puede almacenar hasta 65.535 caracteres.

Tabla comparativa

Aquí tienes un resumen rápido de las diferencias clave:

Característicastring (VARCHAR)text (TEXT)
LongitudRequiere una longitud máxima (por defecto 255).No requiere una longitud máxima.
Uso IdealNombres, títulos, correos electrónicos, contraseñas, URLs.Contenido de artículos, descripciones, comentarios largos.
IndexaciónPuede ser indexado para búsquedas rápidas.No se puede indexar por completo (solo los primeros 255 caracteres).
RendimientoGeneralmente más rápido para consultas y operaciones.Más lento para operaciones de búsqueda y lectura debido a su tamaño.
AlmacenamientoSe almacena en la tabla principal.En algunas bases de datos, los datos grandes se almacenan fuera de la tabla principal.

¿Cuál usar y por qué?

  • Usa string si sabes que la longitud de tu dato no excederá los 255 caracteres. Al tener una longitud fija, la base de datos puede optimizar el almacenamiento y la recuperación, haciendo tus consultas más rápidas.

  • Usa text solo si necesitas almacenar cadenas de texto que superen significativamente los 255 caracteres. El tipo TEXT es ideal para el contenido de un blog o un campo de "comentarios" donde no puedes predecir la longitud máxima.

En resumen: Tu enfoque debe ser usar string por defecto, ya que es más eficiente. Recurre a text solo cuando tus requisitos de longitud lo exijan. Esta es una buena práctica de diseño de bases de datos que te ayudará a optimizar el rendimiento de tu aplicación a largo plazo.

sábado, 25 de enero de 2014

extract-txt-bin-portions.pl: programa el Perl para encontrar cadenas UTF-8 en archivos binarios sin formato

# Lee un archivo mixto UTF-8 - no UTF-8
# output:
# Repeticiones de las líneas de texto:
# "bin: " byte-inicial-secuencia-no-UTF-8 byte-final-secuencia-no-UTF-8
# "txt: " byte-inicial-secuencia-UTF-8 byte-final-secuencia-UTF-8
# por orden de aparición de las secuencias (orden normal de los bytes dentro del archivo)

open my $fh, "<:raw", @ARGV[0] or die "cannot open < @ARGV[0]: $!";
my $i = 0;
my $ini_ciclo_bin = 1;

my $length = read $fh, my $byte, 1;
$i += $length;
# print "a ".unpack("B*", $byte) . "\n";

my $ini_bin;
my $fin_bin;
my $ini_txt;
my $fin_txt;


while($length) {
# ciclo bin
while($length and not unpack("B*", $byte) =~ /^(0|110|1110|11110|111110|1111110).*/) {
$length = read $fh, $byte, 1;
$i += $length;
# print "b ".unpack("B*", $byte) . "\n";
}

# ciclo txt
# inicialización secuencia txt
$ini_txt = $i;
$fin_txt = 0; # no def
my $s_val = 1;   # boolean TRUE, secuencia txt válida (secuencia de caracteres)
while($length and unpack("B*", $byte) =~ /^(0|110|1110|11110|111110|1111110).*/ and $s_val) {
# inicialización 1 caracter
my $l = index(unpack("B*", $byte),'0');
if($l eq 0) {
$l = 1;
}
my $ini_sec_bytes = $i;

# lectura 1 caracter
while($length and $i-$ini_sec_bytes+1 lt $l and $s_val) {
$length = read $fh, $byte, 1;
$i += $length;
# print "c ".unpack("B*", $byte) . "\n";
if(not unpack("B*", $byte) =~ /^10.*/) {
$s_val = 0;   # boolean FALSE
}
}

if($s_val and $i-$ini_sec_bytes+1 eq $l) {
$fin_txt = $i;   # def
$length = read $fh, $byte, 1;
$i += $length;
# print "d ".unpack("B*", $byte) . "\n";
}
}

# delimitar secuencias
if($fin_txt) {   # secuencia txt no vacía
if($ini_txt ne $ini_ciclo_bin) {   # secuencia binaria no vacía
$ini_bin = $ini_ciclo_bin;
$fin_bin = $ini_txt - 1;
print "bin: $ini_bin $fin_bin\n";
}
print "txt: $ini_txt $fin_txt\n";
$ini_ciclo_bin = $fin_txt + 1;   # para la vuelta entrante
}   # si no las condiciones continúan igual para reentrar el ciclo-bin
}
# delimitación final
if($i) {   # archivo no vacío
if($fin_txt and $fin_txt ne $i) {   # secuencia txt no vacía ($fin_txt) and quedaron ($i-$fin_txt) bytes bin al final del archivo
$ini_bin = $fin_txt + 1;
$fin_bin = $i;
print "bin: $ini_bin $fin_bin\n";
}
elsif($fin_txt eq 0) {   # último ciclo txt vacío ==> todo el ciclo corresponde a datos bin
$ini_bin = $ini_ciclo_bin;
$fin_bin = $i;
print "bin: $ini_bin $fin_bin\n";
}
# si no si ($fin_txt eq $i) el archivo termina justo en una secuencia txt, último OUTPUT emitido en ciclo txt
}

close $fh;