11419
**データベースへ、どういう形式のデータを保存すべきか分からないので教えてください**

  * 不特定多数が入力するフォームに、「マークダウンエディタ」もしくは「BBCodeエディタ」を付けたいと考えています
  * この時、データベースへはどういう形式のデータを保存するのでしょうか？

* * *

  * エディタで制限しているので、生HTMLをそのまま格納しても良い？
  * それとも、変換された「マークダウンコード」なり「BBCode」の方を保存するのでしょうか？
  * あるいは、どちらでも良い？
  * それぞれメリットデメリットがあれば教えてください
CC BY-SA 3.0
2015-06-16T12:17:13.540
11418
2015-06-17T02:15:35.717
2015-06-16T12:45:34.407
3639
7886
question
mysql markdown
不特定多数が入力するフォームにマークダウンエディタを付けた場合、データベースへ保存するデータ形式は何になるのでしょうか？
基本的にはMarkdownやBBCodeのまま保存するほうがメリットが多いと思います。

## 1. MarkdownやBBCodeのほうがHTMLよりコンパクト

比べてみれば分かりますが、一般的にはHTMLに変換するとコードが長くなってしまいます。  
変換しないほうが保存するときのサイズが少なくて済みます。

## 2. MarkdownやBBCodeの仕様が変更された時に、古いデータに対しても変更を反映できる

例えば、

`[url]http://ja.stackoverflow.com[/url]`

というBBCodeを

`<a href="http://ja.stackoverflow.com">ja.stackoverflow.com</a>`

というコードに変換していたのを、

`<a href="http://ja.stackoverflow.com"
target="_blank">ja.stackoverflow.com</a>`

に変えたいとなった時、BBCodeで保存していれば変換部分を書き換えればOKです。  
HTMLで保存してしまうと古いデータに反映させるのが面倒になります。

## 3. MarkdownやBBCodeからHTMLへの変換は容易だが、逆は困難

MarkdownならMarkdownのまま表示したりHTMLに変換して表示できますが、逆にHTMLをMarkdownにするのは面倒なためHTMLで保存するとデータの活用がしにくくなります。

* * *

HTMLをそのまま保存するメリットというのはあまり思いつきません。
CC BY-SA 3.0
2015-06-16T13:01:03.383
11419
2015-06-16T13:20:39.760
2015-06-16T13:20:39.760
3639
3639
11418
answer
MarkdownやBBCodeのソースを後で編集する必要があるのであれば、ソースを保存しておかなければなりません。

表示の際に毎回HTMLへのコンバータを通す必要がありますので、アプリケーションによってはパフォーマンスが問題になるでしょう。また、ライブラリを更新したなどでコンバータの挙動が変わると出力結果が変わる場合があります。これは非常に気づきにくいトラブルになります。

ソースを事後に編集する必要が無いのであれば、変換後のHTMLを保存しても良いでしょう。これなら上記のような問題が起きる余地がありません。

アプリケーションの要件次第では、変換前後のデータを両方保存し、事後の編集には返還前のソースを利用、表示には変換後のデータを利用するよう検討しても良いかもしれません。

ところで。

> エディタで制限しているので、生HTMLをそのまま格納しても良い？

データベースに保存する際にはいわゆる文字化けやエスケープ文字の扱いに起因する問題、SQLインジェクションなどが起きないよう配慮する必要がありますがそれは元のデータがテキストである限りHTMLであろうとMarkdownであろうと全く同じです。

HTMLを表示する際に生じる問題(HTML構造の崩壊、不正なスクリプトの挿入、XSS等)を防ぐためのフォーマットの確認やタグの除去などは、入力から表示までのサイクルの中でどこかで確実にやる必要がありますが、データベースにどのように保存するかとは直接関係ありません。

ここを誤解していると誤ったエスケープ(SQLとしてのエスケープをするべきなのにHTMLとしてのエスケープをしてしまう、など)をしてしまうことになります。
CC BY-SA 3.0
2015-06-17T02:15:35.717
11423
2015-06-17T02:15:35.717
5793
11418
answer