El mejor tipo de campo de base de datos para una URL


Necesito almacenar una url en una tabla MySQL. ¿Cuál es la mejor práctica para definir un campo que contenga una URL con una longitud indeterminada?

Author: micahwittman, 2008-10-20

10 answers

  1. Mínimo común denominador longitud máxima de URL entre los navegadores web más populares: 2,083 (Internet Explorer)

  2. Http://dev.mysql.com/doc/refman/5.0/en/char.html
    Los valores en las columnas VARCHAR son cadenas de longitud variable. La longitud se puede especificar como un valor de 0 a 255 antes de MySQL 5.0.3, y de 0 a 65.535 en 5.0.3 y versiones posteriores. La longitud máxima efectiva de un VARCHAR en MySQL 5.0.3 y posteriores está sujeta a la tamaño máximo de fila (65.535 bytes, que se comparte entre todas las columnas) y el conjunto de caracteres utilizado.

  3. Entonces ...
    TEXTO
    o
    > = MySQL 5.0.3 use VARCHAR(2083)

 278
Author: micahwittman,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-10-20 19:55:27

VARCHAR(512) (o similar) debería ser suficiente. Sin embargo, dado que realmente no sabes la longitud máxima de las URL en cuestión, podría ir directamente a TEXT. El peligro con esto es, por supuesto, la pérdida de eficiencia debido a que CLOBs es mucho más lento que un simple tipo de datos de cadena como VARCHAR.

 32
Author: Daniel Spiewak,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-10-20 19:31:31

varchar(max) para SQLServer2005

varchar(65535) para MySQL 5.0.3 y posteriores

Esto asignará el almacenamiento según sea necesario y no debería afectar el rendimiento.

 16
Author: Bob Probst,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-02-09 21:38:57

Usted querrá elegir entre una columna de TEXTO o VARCHAR basada en la frecuencia con la que se utilizará la URL y si realmente necesita que la longitud no esté vinculada.

Use VARCHAR con maxlength >= 2,083 como micahwittman sugirió si:

  1. Usarás muchas URLs por consulta (a diferencia de las columnas de TEXTO, las VARCHARs se almacenan en línea con la fila)
  2. Estás bastante seguro de que una URL nunca excederá el límite de filas de 65,535 byte.

Use TEXTO si :

  1. La URL realmente podría romper el límite de filas de 65,535 bytes
  2. Sus consultas no seleccionarán o actualizarán un montón de URLs a la vez (o muy a menudo). Esto se debe a que las columnas de TEXTO solo mantienen un puntero en línea, y los accesos aleatorios involucrados en la recuperación de los datos referenciados pueden ser dolorosos.
 9
Author: mrgrieves,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 10:31:33

Debe usar un VARCHAR con una codificación de caracteres ASCII. Las URL están codificadas por ciento y los nombres de dominio internacionales usan punycode, por lo que ASCII es suficiente para almacenarlas. Esto usará mucho menos espacio que UTF8.

VARCHAR(512) CHARACTER SET 'ascii' COLLATE 'ascii_general_ci' NOT NULL
 8
Author: Flavio Tordini,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-12-18 10:00:03

La mayoría de los navegadores le permitirán poner cantidades muy grandes de datos en una URL y, por lo tanto, muchas cosas terminan creando URL muy grandes, por lo que si está hablando de algo más que la parte de dominio de una URL, necesitará usar una columna de TEXTO ya que los VARCHAR/CHAR son limitados.

 4
Author: carson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-10-20 19:33:44

Esto realmente depende de su caso de uso (ver más abajo), pero almacenar como TEXT tiene problemas de rendimiento, y un enorme VARCHAR suena como exagerado para la mayoría de los casos.

Mi enfoque: use una longitud VARCHAR generosa, pero no irrazonablemente grande, como VARCHAR(500) más o menos, y anime a los usuarios que necesitan una URL más grande a usar un acortador de URL como safe.mn.

El enfoque de Twitter: Para una experiencia de usuario realmente agradable, proporcione un acortador de URL automático para URL demasiado largas y almacene "mostrar versión" del enlace como un fragmento de la URL con elipses al final. (Ejemplo: http://stackoverflow.com/q/219569/1235702 se mostraría como stackoverflow.com/q/21956... y enlazaría a una URL abreviada http://ex.ampl/e1234)

Notas y Advertencias

  • Obviamente, el enfoque de Twitter es mejor, pero para las necesidades de mi aplicación, recomendar un acortador de URL fue suficiente.
  • Los acortadores de URL tienen sus inconvenientes, como problemas de seguridad. En mi caso, no es un gran riesgo porque las URL no son públicas y no pesadamente usado; sin embargo, esto obviamente no funcionará para todos. safe.mn parece bloquear una gran cantidad de spam y URL de phishing, pero todavía recomiendo precaución.
  • Asegúrese de tener en cuenta que no debe forzar a sus usuarios a usar un acortador de URL. Para la mayoría de los casos (al menos para las necesidades de mi aplicación), 500 caracteres es demasiado suficiente para lo que la mayoría de los usuarios la usarán. Solo use/recomiende un acortador de URL para enlaces demasiado largos.
 4
Author: CullenJ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-04-26 22:09:49

No conozco otros navegadores, pero IE7 tiene un límite de 2083 caracteres para las operaciones HTTP GET. A menos que otros navegadores tengan límites más bajos, no veo por qué necesitarías más caracteres que 2083.

 3
Author: matt b,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-10-20 19:33:54

Es mejor usar varchar(max) que (en términos de tamaño) significa varchar (65535). Esto incluso almacenará sus direcciones web más grandes y ahorrará su espacio también.

El especificador max amplía las capacidades de almacenamiento del varchar, tipos de datos nvarchar y varbinary. varchar(max), nvarchar(max), y varbinary (max) se denominan colectivamente tipos de datos de gran valor. Puedes utilice los tipos de datos de gran valor para almacenar hasta 2^31-1 bytes de datos.

Ver esto artículo en TechNet sobre el uso de Tipos de Datos de Gran Valor

 1
Author: sohaiby,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-02-24 12:33:44

La mayoría de los servidores web tienen un límite de longitud de URL (por lo que hay un código de error para "URI demasiado largo"), lo que significa que hay un tamaño superior práctico. Encuentre el límite de longitud predeterminado para los servidores web más populares y use el más grande de ellos como tamaño máximo del campo; debería ser más que suficiente.

 0
Author: CesarB,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-10-20 19:50:11