2008-12-11 12 views
34

En el servidor SQL 2005 esta consulta¿Por qué 30 es la longitud predeterminada para VARCHAR cuando se utiliza CAST?

select len(cast('the quick brown fox jumped over the lazy dog' as varchar)) 

devuelve 30 como longitud, mientras que la cadena suministrada tiene más caracteres. Este parece ser el predeterminado. ¿Por qué 30, y no 32 o cualquier otra potencia de 2?

[EDITAR] Soy consciente de que siempre debo especificar la longitud al realizar la conversión a varchar, pero esta fue una consulta rápida para dejar algo. Las preguntas permanecen, ¿por qué 30?

+10

Holy crap - No sabía que CAST truncaría así. Siempre asumí que el varchar de vuelta se dimensionaría para que encajara con lo que CAST estaba rellenando. Tengo un código para verificar en ... bbl –

+0

¿Preferirías que fuera 255, como Informix, Sybase y otros valores predeterminados de DB? (ver mi respuesta a continuación) –

Respuesta

35

¿Por qué no especifica la longitud varchar? es decir:

SELECT CAST('the quick brown fox jumped over the lazy dog' AS VARCHAR(45)) 

En cuanto a por qué el 30, esa es la longitud predeterminada en el servidor SQL para ese tipo

De char and varchar (Transact-SQL):

Cuando n no se especifica en la definición de datos o declaración de variables instrucción, la longitud predeterminada es 1. Cuando n no se especifica al usar las funciones CAST y CONVERTIR, la longitud predeterminada es 30.

+1

+1. ¿Por qué no establecerías la longitud? No establecerlo es pedir problemas. – Bert

+2

Fue una consulta rápida y sucia, por lo que no especifiqué. Gracias por indicarme los documentos, aunque se menciona. – edosoft

+0

Tienes suerte de que lo hayas usado allí, si hubieras especificado un parámetro como varchar sin longitud, entonces habrías obtenido un varchar de 1 carácter. Siempre se especifica siempre una longitud cuando se lanza a varchar o se crea un valor variable que es varchar o nvarchar. – HLGEM

3

No sé por qué eligieron 30, pero era el mismo en el Servidor SQL de Sybase, del cual se desarrolló el SQL Server de Microsoft. Parece ser una peculiaridad de esos RDBMS ya que no está en los estándares SQL, y otros servidores difieren en su comportamiento.

+3

Según el estándar SQL, un molde para VARCHAR sin longitud debe ser un molde para VARCHAR (1). Eso no es útil, por lo que siempre debes proporcionar una longitud. Hay un caso en el que 30 es un mejor valor predeterminado que 1; Incluso estaría de acuerdo. Pero por qué 30 en lugar de 25, 32, 40, 64, ... aaah; ¡De esa manera yace la locura! –

+1

Locura Puedo manejar – edosoft

20

En su pregunta de por qué 30 y no 32 o cualquier otra potencia de 2, el tamaño de almacenamiento es n + 2 bytes para varchar (n), lo que hace que el tamaño de almacenamiento de bytes 32 para una cadena de longitud 30. ser que esto es lo que vieron?

A continuación, solo un punto de claridad en algunos de los comentarios: La longitud predeterminada para un campo varchar de longitud no especificada es n = 1. La longitud de cadena predeterminada que CAST o CONVERT devuelve para una conversión de este tipo de datos es 30.

¡Muy buena pregunta!

+5

'varchar (30)' era el tipo de datos de 'sysname' en aquel entonces (y aún es la longitud máxima de los identificadores en Oracle). Tal vez solo pensaron que sería un valor predeterminado conveniente en comparación con decir 14 o 62. –

+0

@MartinSmith Podría ser Martin, y un hecho interesante, pero una vez más, no es la longitud predeterminada para el tipo de datos, sino solo para qué CAST y CONVERTIR devuelve para este tipo de datos. Si quisieran ir con sysname, supongo que habrían tomado el tamaño predeterminado para el tipo de datos en sí 30 y no 1. Pero todos estamos preguntando aquí; -> – Charl

+1

Esperando una respuesta de una fuente creíble y/u oficial:) – edosoft

0

predeterminada con convert/cast no tiene nada que ver con la asignación de memoria y por lo tanto el valor por defecto (es decir, 30) no está relacionado con ninguna potencia de 2.

respecto a por qué el 30, esto se guía de Microsoft que da este valor predeterminado para cubrir los datos básicos en los primeros 30 caracteres. http://msdn.microsoft.com/en-us/library/ms176089.aspx

Aunque siempre se puede modificar la duración durante la conversión/proceso de fundido

select len(cast('the quick brown fox jumped over the lazy dog' as varchar(max))) 
+0

Este enlace ya fue publicado por @curtisk. También en este documento dice que eligen el valor predeterminado 'para cubrir los datos básicos en los primeros 30 caracteres'. ? – edosoft

+0

Cuando n no se especifica al usar las funciones CAST y CONVERT, la longitud predeterminada es 30. Referencia: http://msdn.microsoft.com/en-us/library/ms176089.aspx –

+2

¿Err? Ya acepté la respuesta relacionada con la misma documentación que tú. No ha proporcionado ningún conocimiento nuevo – edosoft

2

Microsoft eligió 30 como la longitud predeterminada de CHAR y VARCHAR de SQL Server, Jet Acceso del motor y varios otros de DB su productos. Se origina en los viejos tiempos cuando la longitud predeterminada de una columna de nombre o dirección se estableció inicialmente en 30. Otros DB's como Informix están predeterminados a 20 para CHAR y 255 para VARCHAR.

+0

. Este es el comportamiento en Sybase también, así que supongo que es anterior a la participación de Microsoft. –

+0

Cualquier puntero a un documento que explique este comportamiento (¿longitud predeterminada de las columnas de nombre y dirección?) – edosoft

+0

¡No realmente! ... Pero si nos fijamos en la longitud, 30, se ha utilizado ampliamente para ese tipo de columnas en toda la industria. [Enlace MSDN] (http://msdn.microsoft.com/en-us/library/aa258242%28v=sql.80%29.aspx) _ "Observaciones Cuando n no se especifica en una definición de datos o declaración de variable declaración, la longitud predeterminada es 1. Cuando n no se especifica con la función CAST, la longitud predeterminada es 30. "_ –

Cuestiones relacionadas