Como han señalado otros, la #2 es la respuesta correcta. Déjalo "en bruto" hasta que lo necesites, luego escapa apropiadamente.
Para explicar por qué (y repetiré/resumiré las otras publicaciones), llevemos el escenario 1 a su extremo lógico.
Qué sucede cuando alguien ingresa " ' OR 1=1 <other SQL injection> --
". Ahora tal vez decidas que debido a que usas SQL debes codificar para SQL (quizás porque no usaste declaraciones parametrizadas). Así que ahora tienes que mezclar (o decidir sobre) la codificación SQL y HTML.
De repente, su jefe decide que también quiere una salida XML. Ahora, para mantener la consistencia de su patrón, también necesita codificar eso.
Siguiente CSV - ¡oh, no! ¿Qué pasa si hay comillas y comas en el texto? ¡Más escapes!
Oye, ¿qué tal una buena interfaz AJAX interactiva? Ahora probablemente desee comenzar a enviar JSON de regreso al navegador, por lo que ahora {, [ etc., todo debe tenerse en cuenta. ¡¡AYUDA!!
Claramente, almacene los datos tal como se proporcionan (sujeto a restricciones de dominio, por supuesto) y codifíquelos de manera adecuada para su resultado en el momento que lo necesite . Tu resultado no es lo mismo que tus datos.
Espero que esta respuesta no sea demasiado condescendiente. Crédito a los demás encuestados.