Vous le produisez exactement comme MySQL le stocke. Le navigateur est configuré pour l'afficher différemment que vous ne le produisez, car vous produisez du contenu textuel dans une page HTML. (En particulier, il n'affiche pas de nouvelle ligne pour chaque nouvelle ligne que vous affichez).
Pour qu'il s'affiche correctement en HTML, vous devez remplacer les nouvelles lignes par un caractère de saut de ligne, nl2br
est une fonction utile dans ce but précis.
D'autres façons de forcer le navigateur à l'afficher comme vous le souhaitez sont de définir le type de contenu sur text/plain
au lieu de text/html
ou utilisez le <pre>
balise.