Necesito almacenar una url en una tabla MySQL. ¿Cuál es la mejor práctica para definir un campo que contendrá una URL con una longitud indeterminada?El mejor tipo de campo de base de datos para una URL
Respuesta
Lowest common denominator max URL length among popular web browsers: 2,083 (Internet Explorer)
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.Entonces ...
< MySQL 5.0.3 uso TEXTO
o
> = MySQL 5.0.3 uso VARCHAR (2083)
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
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
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'. –
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
.
¿qué tal la colación? – kommradHomer
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.
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? –
Es una sintaxis SQL2005. Editando. . . –
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
La mayoría de los navegadores le permiten poner very large amounts of data in a URL y así muchas cosas terminan creando URLs muy grandes así que si está hablando de algo más que la parte de dominio de una URL necesitará usar una columna TEXT desde VARCHAR/CHAR are limited.
No sé sobre otros navegadores, pero IE7 has a 2083 character limit for HTTP GET operations. A menos que otros navegadores tengan límites inferiores, no veo por qué necesitaría más caracteres que 2083.
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.
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
'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
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:
- 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)
- Está bastante seguro de que una URL nunca excederá el límite de fila de 65.535 bytes.
Uso TEXTO si:
- La URL realmente podría romper el límite de fila 65.535 bytes
- 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.
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.
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? :-) –
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
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
¿UTF-8 no usa más espacio cuando solo tiene que hacerlo? – kommradHomer
- 1. ¿Cuál es el mejor tipo de columna para URL?
- 2. ¿Qué tipo de datos es mejor para almacenar artículos en la base de datos SQL?
- 3. Mejor base de datos para el desarrollo de teléfonos móviles
- 4. Mejor estructura de base de datos para almacenar feeds RSS
- 5. ¿Cuál es la mejor forma de buscar el tipo de datos Long dentro de una base de datos Oracle?
- 6. CouchDB crea una base de datos por tipo de documento?
- 7. ¿Existe una base de datos tipo "Northwind" disponible para MySQL?
- 8. Tipo de datos SQL Server para almacenar solo el campo de tiempo como 09:10 etc.
- 9. Tipo de campo de datos apropiado para el valor verdadero/falso?
- 10. ¿Cuál es el mejor método/opción para los registros vencidos en una base de datos?
- 11. ¿Cuál es el mejor campo para guardar el cumpleaños?
- 12. ¿Cuál es el mejor enfoque para almacenar información de ubicación en una base de datos?
- 13. ¿Cómo representar mejor las direcciones en una base de datos
- 14. ¿Cómo determinar el tipo de base de datos para una conexión JDBC determinada?
- 15. ¿Cuál es la "mejor" base de datos para incrustado?
- 16. ¿Cómo implementar C# enum para el campo enumerado de la base de datos char (1)?
- 17. campo Actualización con datos de otra base de datos
- 18. Error de actualización de base de datos de campo CodeIgniter
- 19. mejor intercalación predeterminada de una base de datos multilingüe
- 20. ¿Se debe almacenar "http: //" con un registro de base de datos de una URL?
- 21. MySQL tipo de datos base de datos de
- 22. ¿Mejor tipo para datos UTF-8?
- 23. tipo de campo para timestamp unix
- 24. ¿Cuál es la mejor manera de perfilar una base de datos sqlserver 2005 para el rendimiento?
- 25. para cuerdas en Grails demasiado grande para el campo de la base de datos
- 26. Tipo de campo PostgreSQL para timestamp unix?
- 27. Filtrar la base de datos Django para el campo que contiene cualquier valor en una matriz
- 28. ¿Qué tipo de datos .NET es mejor para mapear el NÚMERO de tipo de datos de Oracle en NHibernate?
- 29. Mejor base de datos para la aplicación Node.js usando websockets
- 30. CakePHP - configuración de base de datos basada en la URL
Depende de lo que necesite, indexación, unicidad? –