¿Cuál es la forma canónica de almacenar texto arbitrario (posiblemente marcado) en SQL?

StackOverflow https://stackoverflow.com/questions/95459

  •  01-07-2019
  •  | 
  •  

Pregunta

¿Qué hacen wikis/stackoverflow/etc.hacer cuando se trata de almacenar texto?¿El texto está dividido en nuevas líneas?¿Está dividido en trozos de longitud fija?¿Cuál es la mejor manera de almacenar fragmentos de texto arbitrariamente largos?

¿Fue útil?

Solución

nvarchar(máx.) ftw.porque complicar demasiado las cosas simples es malo, ¿vale?

Otros consejos

Supongo que si necesitas ofrecer la posibilidad de almacenar grandes cantidades de texto y no te importa no poder mirar demasiado su contenido al realizar consultas, puedes usar CLobs.

Todo esto depende del RDBMS que esté utilizando, así como de los tipos de texto que vaya a almacenar.Si el texto está formateado en fragmentos considerables de datos que significan algo en sí mismos, como, por ejemplo, encabezado/cuerpo, entonces es posible que desee dividir los datos en columnas de estos tipos.Es posible que se necesiten varias tablas para utilizar este método según el contenido con el que esté tratando.

No sé cómo lo manejan otros RDBMS, pero sé que no es una buena idea tener más de una columna abierta en cada tabla (texto o varchar(max)).Por lo tanto, querrás asegurarte de que solo una columna tenga caracteres ilimitados.

Respecto a PostgreSQL: use el tipo TEXTO o BYTEA.Si necesita leer fragmentos aleatorios, puede considerar objetos grandes.

Si necesita preocuparse por mantener elementos como el formato de cadenas, comillas y otros elementos "crudos" en el texto, como probablemente lo haría el código, entonces los caracteres especiales deben escaparse por completo primero; de lo contrario, al enviar la base de datos, podrían terminar provocando que se emita un comando no válido.

La mayoría de los lenguajes de programación tienen herramientas para hacer esto integradas de forma nativa.

Supongo que depende de dónde quieras almacenar el texto, si necesitas cosas como transacciones, etc.

Las bases de datos como SQL Server tienen un tipo que puede almacenar campos de texto largos.En SQL Server 2005, esto sería principalmente nvarchar(max) para cadenas de texto Unicode largas.Al utilizar una base de datos, puede beneficiarse de las transacciones y de una copia de seguridad/restauración sencilla, suponiendo que esté utilizando la base de datos para otras cosas como lo hace StackOverflow.com.

La alternativa es almacenar texto en archivos en el disco.Esto puede ser bastante sencillo de implementar y puede funcionar en entornos donde una base de datos no está disponible o es excesiva.

En cuanto al formato del texto que se almacena en una base de datos o archivo, probablemente sea muy parecido al de entrada.Si es HTML, entonces simplemente lo empujaría a través de una función que lo escaparía correctamente.

Algo para recordar es que probablemente quieras usar Unicode o UTF-8 desde la creación hasta el almacenamiento y viceversa.Esto le permitirá admitir idiomas adicionales.Cualquier problema con este mecanismo de codificación dañará su texto.Históricamente, es posible que las personas hayan optado por ASCII de forma predeterminada basándose en la suposición de que estaban ahorrando espacio en disco, etc.

Para servidor SQL:

Utilice un varchar(max) para almacenar.Creo que el límite superior es 2 GB.

No intentes escapar del texto tú mismo.Pase el texto a través de una estructura de parametrización que realizará los escapes correctamente por usted.En .Net, agregaría un parámetro a un SqlCommand o simplemente usaría LinqToSQL (que luego administra el SqlCommand por usted).

Sospecho que StackOverflow está almacenando texto en formato de rebajas en una columna de 'texto' de tamaño arbitrario.Quizás como UTF8 (pero podría ser UTF16 o algo así).Supongo que es SQL Server, del cual no sé mucho).

Como regla general, desea almacenar cosas en su base de datos en la forma más "cruda" posible.Es decir, haga toda la decodificación y posiblemente la limpieza, pero no haga nada más con él (por ejemplo, si es Markdown, no lo codifique en HTML, déjelo en su formato original "sin formato")

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top