Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

386
Vistas
TINYTEXT como clave PRIMARIA en MySQL?

Las entradas en mi tabla se identifican de forma única por una palabra que tiene entre 5 y 10 caracteres y uso TINYTEXT(10) para la columna. Sin embargo, cuando trato de configurarlo como clave PRINCIPAL, aparece el error de que falta el size .

Desde mi comprensión limitada de los documentos, el Size de las claves PRIMARIA se puede usar para simplificar una forma de detectar un valor único, es decir, cuando los primeros caracteres (especificados por Size ) pueden ser suficientes para considerarlo una coincidencia única. En mi caso, el size diferiría de 5 a 10 (son todos latin1 por lo que son byte exacto por carácter + 1 para la longitud). Dos preguntas:

  1. Si quisiera usar TINYTEXT como clave PRIMARIA, ¿qué size debo especificar? Máximo disponible: ¿10 en este caso? O debería ser el size estrictamente EXACTO, por ejemplo, si mi clave es una palabra de 6 caracteres, pero especifico Size para PK como 10: ¿intentará leer los 10 y fallará y me lanzará una excepción?
  2. ¿Qué tan malo sería usar [TINY]TEXT para el PK en términos de rendimiento? Todos los resultados de Google me llevan a opiniones y declaraciones "es MALO, estás despedido", pero ¿es realmente cierto en este caso, considerando que TINYTEXT es 255 máx. y ya especifiqué una longitud máxima de 10?
over 4 years ago · Santiago Trujillo
3 Respuestas
Responde la pregunta

0

  1. MySQL/MariaDB puede indexar solo los primeros caracteres de los campos de texto, pero no todo el texto si es demasiado grande. El tamaño máximo de la clave es de 3072 bytes y cualquier campo de texto mayor que ese no se puede usar como CLAVE. Por lo tanto, en los campos de texto de más de 3072 bytes, debe especificar explícitamente cuántos caracteres indexará. Cuando se usa VARCHAR o CHAR, se puede hacer directamente porque lo establece explícitamente al declarar el tipo de datos. No es el caso con *TEXT - no tienen esa opción. La solución es crear la clave principal de esta manera:

     CREATE TABLE mytbl ( name TEXT NOT NULL, PRIMARY KEY idx_name(name(255)) );

    Se puede hacer el mismo truco si necesita crear una clave principal en un campo VARCHAR que tenga más de 3072 bytes, en campos BINARIOS y BLOB. De todos modos, puede imaginar que si dos textos grandes y diferentes comienzan con los mismos caracteres en los primeros 3072 bytes al principio, el sistema los tratará como iguales. Eso puede ser un problema.

  2. En general, es una mala idea usar el campo de texto como clave principal. Hay dos razones para eso:

    2.1. Se necesita mucho más tiempo de procesamiento que usar números enteros para buscar en la tabla (DÓNDE, UNIONES, etc.). El enlace es antiguo pero sigue siendo relevante;

    2.2. Cualquier clave externa en otra tabla debe tener el mismo tipo de datos que la clave principal. Cuando usa texto, esto desperdiciará espacio en disco;

Nota: la diferencia entre *TEXT y VARCHAR es que el contenido de los campos *TEXT no se almacena dentro de la tabla sino en una ubicación de memoria externa. Por lo general, hacemos eso cuando necesitamos almacenar texto realmente grande.

over 4 years ago · Santiago Trujillo Denunciar

0

para TINYTEXT no se puede especificar el tamaño. Usar VARCHAR (tamaño)

Tipos de datos SQL

over 4 years ago · Santiago Trujillo Denunciar

0

FYI, no puede especificar un tamaño para TINYTEXT en MySQL:

 mysql> create table t1 ( t tinytext(10) ); ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '(10) )' at line 1

Puede especificar una longitud después de TEXT , pero no funciona como cree. Significa que elegirá uno de la familia de tipos de TEXTO, el tipo más pequeño que admita al menos la longitud que solicitó. Pero una vez que lo hace, no limita la longitud de la entrada. Todavía acepta cualquier dato hasta la longitud máxima del tipo que eligió.

 mysql> create table t1 ( t text(10) ); Query OK, 0 rows affected (0.02 sec) mysql> show create table t1\G *************************** 1. row *************************** Table: t1 Create Table: CREATE TABLE `t1` ( `t` tinytext ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 mysql> insert into t1 set t = repeat('a', 255); Query OK, 1 row affected (0.01 sec) mysql> select length(t) from t1; +-----------+ | length(t) | +-----------+ | 255 | +-----------+
over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda