2008-10-20 25 views

Respuesta

257
  1. Lowest common denominator max URL length among popular web browsers: 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 posterior está sujeta al tamaño máximo de fila (65.535 bytes, que se comparte entre todas las columnas) y al juego de caracteres utilizado.

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

+12

Buena respuesta, pero personalmente limitaría la duración. Dependiendo del proyecto, es posible que desee limitar las URL aceptadas. ¿Quién usa url longet than 200? – John

+2

Será mejor que ideen un tipo de datos uri que "comprenda" la estructura de uri para que la indexación y la búsqueda se realicen de manera eficiente, como oráculo ... espere, mysql ahora es Oracle ... http: // download .oracle.com/docs/cd/B10464_05/web.904/b12099/adx06uri.htm – redben

+53

Esta respuesta es un poco engañosa. Tenga en cuenta que el "común denominador más bajo" aquí no tiene sentido, quiere usar el número * más alto * que aceptará un navegador o servidor (que no es coherente y está sujeto a cambios). Como dice su enlace: "* ... la especificación del protocolo HTTP no especifica ninguna longitud máxima ... *", así que no se moleste con ese 'VARCHAR (2083)', simplemente use 'TEXT'. –

32

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

+0

¿qué tal la colación? – kommradHomer

14

varchar(max) para SQLServer2005

varchar(65535) para MySQL 5.0.3 y más tarde

Esto asignar almacenamiento como necesidad y no debe afectar al rendimiento.

+1

En su fragmento de código, ¿'max' es un especificador ANSI SQL mágico para hacer crecer el tamaño de VARCHAR según sea necesario, o solo es una metavariable por ejemplo? –

+1

Es una sintaxis SQL2005. Editando. . . –

+4

En MySQL lo más probable es que no pueda tener un varchar tan grande a menos que sea la única columna en la tabla. – carson

0

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 el tamaño máximo del campo; debería ser más que suficiente.

1

Será mejor use varchar(max) que (en términos de tamaño) signifique varchar (65535). Esto incluso almacenará sus direcciones web más grandes y también le ahorrará espacio.

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

Ver this article en TechNet sobre el uso Uso de Alto Valor de tipos de datos

+0

'varchar (max)' es la sintaxis de SQLServer, no adecuada para MySQL (como en la pregunta original). Además, no significa 'varchar (65535)' ya que 65535 es el número máximo de caracteres ASCII en una fila en mysql, por lo que depende también de los otros campos y del conjunto de caracteres. – furins

6

Usted querrá elegir entre un texto o una columna VARCHAR basado en con qué frecuencia se utiliza la URL y si realmente necesita la longitud para ser desatada.

Uso VARCHAR con maxlength> = como micahwittman sugirió si:

  1. Vamos a usar una gran cantidad de direcciones URL por consulta (a diferencia de columnas TEXT, VARCHAR se almacenan en línea con la fila)
  2. Está bastante seguro de que una URL nunca excederá el límite de fila de 65.535 bytes.

Uso TEXTO si:

  1. La URL realmente podría romper el límite de fila 65.535 bytes
  2. Sus consultas no seleccionar o actualizar un grupo de direcciones URL a la vez (o muy a menudo) . Esto se debe a que las columnas de TEXTO solo tienen un puntero en línea, y los accesos aleatorios que participan en la recuperación de los datos a los que se hace referencia pueden ser dolorosos.
4

Esto realmente depende de su caso de uso (ver más abajo), pero el almacenamiento como TEXT tiene problemas de rendimiento, y una enorme VARCHAR suena como una exageración para la mayoría de los casos.

Mi enfoque: utilizar un generoso, pero no excesivamente grande VARCHAR longitud, como VARCHAR(500) más o menos, y animar a los usuarios que necesitan una URL más grande para usar un acortador de URL como safe.mn.

El enfoque Twitter: Para un muy buen UX, proporcione un acortador de URL automática para excesivamente larga URL y almacenar la versión "pantalla" del enlace como un fragmento de la URL con puntos suspensivos al final. (Ejemplo: http://stackoverflow.com/q/219569/1235702 se muestra como stackoverflow.com/q/21956... y uniría a una URL acortada http://ex.ampl/e1234)

Notas y Advertencias

  • Obviamente, el enfoque Twitter es mejor, pero para las necesidades de mi aplicación, recomendando una URL acortador 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 se usan mucho; sin embargo, esto obviamente no funcionará para todos. safe.mn parece bloquear una gran cantidad de spam y URL de phishing, pero aún así recomiendo precaución.
  • Asegúrese de tener en cuenta que no debe forzar a sus usuarios a utilizar 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 lo usarán. Solo use/recomiende un acortador de URL para enlaces excesivamente largos.
+8

Si proporciona un acortador de URL integrado, ¿no será necesario que guarde la url de larga duración en una base de datos para que funcione? :-) –

+0

Por supuesto; pero dudo que la mayoría de la gente escriba su propio abreviador. Desde que escribí esto, aprendí que hay muchas API de acortamiento de URL (71 se enumeran aquí: http://www.programmableweb.com/news/71-url-shortener-apis-bit.ly-google-url -shortener-and-tiny-url-open/2012/10/31), por lo que podría automatizar el proceso sin siquiera escribir el suyo. Todavía depende del conocimiento y el consentimiento del usuario, por supuesto. – CullenJ

7

Debe utilizar un VARCHAR con una codificación de caracteres ASCII. Las URL están codificadas en porcentajes y los nombres de dominio internacionales usan punycode para que ASCII sea suficiente para almacenarlas. Esto usará mucho menos espacio que UTF8.

VARCHAR(512) CHARACTER SET 'ascii' COLLATE 'ascii_general_ci' NOT NULL 
+2

¿UTF-8 no usa más espacio cuando solo tiene que hacerlo? – kommradHomer

Cuestiones relacionadas