strapiのDB上でのデータ型調べてみた

こんにちは。株式会社dottの山上です。
Strapi Advent Calenderも佳境に入ってきた21日目の本日は、strapiのデータ型がDB上でどう表現されるのか調べてみたので、書いて行きたいと思います。

Strapi Advent Calenderのその他の記事は[こちら](https://qiita.com/advent-calendar/2020/strapi)

# strapiのデータ型
strapiでは、以下のようなデータ型が用意されています。
![スクリーンショット 2020-12-21 21.20.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/309371/a6a65afd-353a-719b-2740-a5d71d61bed4.png)

それぞれのDB上の型定義と比較しながら見ていきたいと思います。
(ただし、今回はRelation, Component, DynamicZoneについては自分の理解度も足りてないので一旦割愛します。)

### Text
text型はshort textとlong textが選択できます。
![スクリーンショット 2020-12-21 21.22.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/309371/61c07668-ef1e-2de1-dbe7-52180bde37dc.png)

### Email
フィールド名以外、特に選択する項目はありません。
![スクリーンショット 2020-12-21 21.40.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/309371/94b5639d-dbb1-ccd1-0a39-1abb030cf71e.png)

### RichText
フィールド名以外、特に選択する項目はありません。
![スクリーンショット 2020-12-21 21.42.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/309371/5f99f45f-1d86-a673-c3cb-1f3d998146d2.png)

### Password
フィールド名以外、特に選択する項目はありません。
![スクリーンショット 2020-12-21 21.42.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/309371/811a420c-5250-4ec7-980f-37eea65f6a74.png)

### Number
number型はinteger, big integer, decimal, floatから選択可能です。
![スクリーンショット 2020-12-21 21.43.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/309371/5d657a96-9fc7-3bdf-2142-979d8643a1da.png)

### Enum
enum型はenumの要素を定義できるボックスが用意されていました。
![スクリーンショット 2020-12-21 21.44.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/309371/77232c5f-6a33-7c80-2e9c-5a73dd8f8e40.png)

### Date
date型はdate, datetime, timeから選択可能です。
![スクリーンショット 2020-12-21 21.45.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/309371/9cfa02f8-f599-1e25-e53a-c752d2920abf.png)

### Media
media型は複数の項目と単品の項目が選択可能です。
![スクリーンショット 2020-12-21 21.46.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/309371/3169a259-4348-1138-4455-dda83cc238a5.png)

### Boolean
フィールド名以外、特に選択する項目はありません。
![スクリーンショット 2020-12-21 21.48.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/309371/62a61d31-daea-df9c-e27f-39dfde52fbb0.png)

### JSON
フィールド名以外、特に選択する項目はありません。
![スクリーンショット 2020-12-21 21.49.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/309371/88bb7e44-549d-40e3-35a0-510d35e767be.png)

### UID
uid型はattached typeがnone, shortText, longTextと選択可能でした。
![スクリーンショット 2020-12-21 21.50.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/309371/7a3c14af-dc09-8dc6-a0cd-af05e41e889b.png)

# とりあえず全部作ってみた
ローカルのDBはSQLiteで作成されるので、Postgresqlなどで動かすとまた結果が変わるかもしれませんが、とりあえず上記の項目毎に1つずつフィールドを作ってローカルのDBを確認してみました。
(relational_modelは前回の記事作成時にそのままになってるrelationの項目です。)

![スクリーンショット 2020-12-21 21.52.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/309371/89a9fb6d-5ad4-4cc7-cf83-cd232481594a.png)

結果は以下の通り。

- varchar(255)(=文字数制限ありの文字列)
    - email
    - text型のshorttext
    - password
    - enum
    - UID型のattached field=none
    - UID型のattached field=shorttext
    - UID型のattached field=longtext
- text(=文字数制限なしの文字列)
    - text型のlongtext
    - richtext
    - json
- integer
    - number型のinteger
- bigint
    - number型のbig integer
- float
    - number型のdecimal
    - number型のfloat
- date
    - date型のdate
- datetime
    - date型のdatetime
- time
    - date型のtime
- boolean
    - boolean

データ型については以下も参照してみてください。
・・・自分でも読んでみたけど、SQLiteのデータ型がすごい種類少ない？
[SQLite](https://www.sqlite.org/datatype3.html)
[Postgresql](https://www.postgresql.jp/document/12/html/datatype.html)

# DB上の型は同じだけどstrapi上で定義が別れているものの違い
strapi上で定義が別れているものは、管理画面側のUIで違いが出てるっぽいです。

### email
emailの形にしないとバリデーションでエラーにしてくれます。
![スクリーンショット 2020-12-21 22.21.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/309371/ab6e6d72-a954-c91c-77b3-7847eca6429e.png)

### longtext, richtext
longtextが単純なテキストボックスなのに対し、richtextはmarkdown形式で色々と装飾ができるようになっています。
![スクリーンショット 2020-12-21 22.19.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/309371/9bb4f8d4-58b4-b2a8-5742-fc075a7494bb.png)

### password
目のアイコンをクリックでパスワードの表示非表示を切り替えられるようになっています。
![スクリーンショット 2020-12-21 22.26.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/309371/b732c085-9444-a2ac-5b00-05cef1ccea56.png)

### integer
右の上下矢印で１ずつ増減できるようになっています。
![スクリーンショット 2020-12-21 22.27.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/309371/23bc7e4b-890f-50d9-aab2-5dc2345dc3e0.png)

### decimal, float
こちらは0.1ずつ増減できるようになっています。
![スクリーンショット 2020-12-21 22.28.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/309371/461075f2-f28b-eb0b-eb96-d791eed3ac8d.png)

### enum
定義時の要素が一覧で選択できるようになっています。
![スクリーンショット 2020-12-21 22.29.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/309371/03db207c-c4ec-fbd5-8692-eced1d70cf5a.png)

### datetime, date, time
それぞれ、日付と時間が選択できるようになっています。
![スクリーンショット 2020-12-21 22.30.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/309371/be7392b7-043b-4caf-db44-0b18da063e84.png)
![スクリーンショット 2020-12-21 22.30.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/309371/36a72063-fe8d-b52f-9261-56a9a9654d81.png)
![スクリーンショット 2020-12-21 22.31.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/309371/77c00e33-833f-d023-cdaa-74348d6b766e.png)

### media
見た目一緒なのですが、クリックした後の挙動が違います。
multiの場合は画像の選択時に複数同時に選択できるようになっています。
![スクリーンショット 2020-12-21 22.34.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/309371/c4c6401d-f8bd-2a60-965b-9675356c2da4.png)

### boolean
分かりやすいです。
![スクリーンショット 2020-12-21 22.37.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/309371/cbe992d5-85a8-1241-d6c3-352780c00c88.png)

### JSON
ちゃんとJSONフォーマットで入れないとエラーにしてくれます。
![スクリーンショット 2020-12-21 22.37.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/309371/dc488d71-d53e-d621-3898-64b26dbb7c0f.png)

### UID
UIDを自動生成してくれる様子・・・？仕組みがよくわかってないですorz
![スクリーンショット 2020-12-21 22.39.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/309371/3f07ff87-a907-0616-6b67-11505e291beb.png)

# まとめ

- strapiにはデフォルトで様々なパターンに対応できるデータ型が用意されている
- strapiでの定義が違っても、DB上でのデータ型は同じ、と言う型がいくつかあった
- strapiでの定義が違う型は、管理画面のUIがそのデータ型に合わせて表示される
- 上記の違いを理解して、上手いこと使い分けていきましょう

今回は以上になります。