No hay diferencia, debajo del capó es todo varlena
( matriz de longitud variable ).
Consulte este artículo de Depesz: http://www.depesz.com/index.php/2010/03/02/charx-vs-varcharx-vs-varchar-vs-text/
Un par de puntos destacados:
Para resumir todo esto:
- char (n): ocupa demasiado espacio cuando se manejan valores más cortos que
n
(los rellena n
) y puede generar errores sutiles debido a la adición de espacios finales, además es problemático cambiar el límite
- varchar (n): es problemático cambiar el límite en el entorno en vivo (requiere un bloqueo exclusivo mientras se modifica la tabla)
- varchar - al igual que el texto
- texto - para mí un ganador - sobre (n) tipos de datos porque carece de sus problemas, y sobre varchar - porque tiene un nombre distinto
El artículo realiza pruebas detalladas para mostrar que el rendimiento de las inserciones y las selecciones para los 4 tipos de datos son similares. También toma una mirada detallada a formas alternativas de restringir la longitud cuando sea necesario. Las restricciones o dominios basados en funciones proporcionan la ventaja de un aumento instantáneo de la restricción de longitud, y sobre la base de que es poco frecuente reducir una restricción de longitud de cadena, depesz concluye que una de ellas suele ser la mejor opción para un límite de longitud.
Como " conjuntos de caracteres " en los puntos de documentación a cabo,
varchar(n)
,char(n)
, ytext
se almacenan de la misma manera. La única diferencia es que se necesitan ciclos adicionales para verificar la longitud, si se da uno, y el espacio y el tiempo adicionales necesarios si se necesita rellenochar(n)
.Sin embargo, cuando solo necesita almacenar un solo carácter, existe una ligera ventaja de rendimiento al usar el tipo especial
"char"
(mantenga las comillas dobles, son parte del nombre del tipo). Obtiene un acceso más rápido al campo y no hay gastos generales para almacenar la longitud.Acabo de hacer una tabla de 1,000,000
"char"
elegidos al azar del alfabeto en minúsculas. Una consulta para obtener una distribución de frecuencia (select count(*), field ... group by field
) tarda aproximadamente 650 milisegundos, frente a aproximadamente 760 en los mismos datos utilizando untext
campo.fuente
"char"
no eschar
?? ¿Es válido actualmente en PostgreSQL 11+? ... Sí: "El tipo"char"
(tenga en cuenta las comillas) es diferente de char (1) en que solo usa un byte de almacenamiento. Se usa internamente en los catálogos del sistema como un tipo de enumeración simplista ". , guía / datatype-character .ACTUALIZACIÓN DE BANCOS PARA 2016 (pg9.5 +)
Y utilizando puntos de referencia "SQL puro" (sin ningún script externo)
use cualquier string_generator con UTF8
principales puntos de referencia:
2.1. INSERTAR
2.2. SELECCIONE comparando y contando
Preparar prueba específica (ejemplos)
Realizar una prueba básica:
Y otras pruebas,
... y uso
EXPLAIN ANALYZE
.ACTUALIZADO DE NUEVO 2018 (pg10)
pequeña edición para agregar los resultados de 2018 y reforzar las recomendaciones.
Resultados en 2016 y 2018
Mis resultados, después de la media, en muchas máquinas y muchas pruebas: todo lo mismo
(estadísticamente menos desviación estándar que el estándar).
Recomendación
Utilice el
text
tipo de datos,evite los antiguos
varchar(x)
porque a veces no es un estándar, por ejemplo, en lasCREATE FUNCTION
cláusulasvarchar(x)
≠varchar(y)
.límites expresos (¡con el mismo
varchar
rendimiento!) conCHECK
cláusula en elCREATE TABLE
ej
CHECK(char_length(x)<=10)
.Con una pérdida insignificante de rendimiento en INSERT / UPDATE, también puede controlar los rangos y la estructura de la cadena,
por ejemplo
CHECK(char_length(x)>5 AND char_length(x)<=20 AND x LIKE 'Hello%')
fuente
"char"
, eso no es asíchar
, incluso hoy en día en PostgreSQL 11+. Como dice el carácter guía / tipo de datos "El tipo"char"
(tenga en cuenta las comillas) es diferente de char (1) en que solo usa un byte de almacenamiento. Se usa internamente en los catálogos del sistema como un tipo de enumeración simplista ". .En el manual de PostgreSQL
Usualmente uso texto
Referencias: http://www.postgresql.org/docs/current/static/datatype-character.html
fuente
En mi opinión,
varchar(n)
tiene sus propias ventajas. Sí, todos usan el mismo tipo subyacente y todo eso. Pero, debe señalarse que los índices en PostgreSQL tienen su límite de tamaño de 2712 bytes por fila.TL; DR: si usa el
text
tipo de letra sin restricción y tiene índices en estas columnas, es muy posible que alcance este límite para algunas de sus columnas y obtenga un error cuando intente insertar datos, pero con el usovarchar(n)
puede evitarlo.Algunos detalles más: El problema aquí es que PostgreSQL no da ninguna excepción al crear índices para el
text
tipo ovarchar(n)
donden
es mayor que 2712. Sin embargo, dará error cuando se intente insertar un registro con un tamaño comprimido mayor que 2712. Significa que puede insertar 100,000 caracteres de cadena que está compuesta por caracteres repetitivos fácilmente porque se comprimirá muy por debajo de 2712, pero es posible que no pueda insertar alguna cadena con 4000 caracteres porque el tamaño comprimido es mayor de 2712 bytes. Si usavarchar(n)
wheren
no es mucho mayor que 2712, estará a salvo de estos errores.fuente
text y varchar tienen diferentes conversiones de tipo implícito. El mayor impacto que he notado es el manejo de espacios finales. Por ejemplo ...
regresa
true, false, true
y notrue, true, true
como es de esperar.fuente
Algo OT: si está utilizando Rails, el formato estándar de las páginas web puede ser diferente. Para los formularios de entrada de datos, los
text
cuadros son desplazables, pero los cuadroscharacter varying
(Railsstring
) son de una línea. Mostrar vistas son tan largas como sea necesario.fuente
Una buena explicación de http://www.sqlines.com/postgresql/datatypes/text :
fuente
character varying(n)
,varchar(n)
- (Ambos lo mismo). el valor se truncará en n caracteres sin generar un error.character(n)
,char(n)
- (Ambos lo mismo). de longitud fija y se rellenará con espacios en blanco hasta el final de la longitud.text
- Longitud ilimitada.Ejemplo:
Obtenemos los resultados:
fuente