MySQLのデータ型についてまとめています。
以下、MySQL8.0.19を前提に解説しています。また、データベースとして、MySQLのサンプルデータベースEmployeesを使っています。
MySQLのデータ型の一覧
MySQLには、数値型、日付・時間型、文字列型のデータ型があります。
参考)MySQL :: MySQL 5.6 リファレンスマニュアル :: 11 データ型
数値型
- 整数型 (真数値) INTEGER、INT、SMALLINT、TINYINT、MEDIUMINT、BIGINT
- 固定小数点型 (真数値) DECIMAL、NUMERIC
- 浮動小数点型 (概数値) FLOAT、DOUBLE
- ビット値型 BIT
日付・時間型の一覧
- DATE、DATETIME、および TIMESTAMP 型
- TIME 型
- YEAR 型
文字列型の一覧
- CHAR および VARCHAR 型
- BINARY および VARBINARY 型
- BLOB 型と TEXT 型
- ENUM 型
- SET 型
テーブルカラムのデータ型確認はshow columns
カラムのデータ型を確認するshow columnsの構文は以下の通りです。
show columns from テーブル名
employees(社員テーブル)のカラムのデータ型を確認してみましょう。
mysql> show columns from employees; +------------+---------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +------------+---------------+------+-----+---------+-------+ | emp_no | int | NO | PRI | NULL | | | birth_date | date | NO | | NULL | | | first_name | varchar(14) | NO | | NULL | | | last_name | varchar(16) | NO | | NULL | | | gender | enum('M','F') | NO | | NULL | | | hire_date | date | NO | | NULL | | +------------+---------------+------+-----+---------+-------+
like を使って、ワイルドカードによるテーブル指定も可能です。長いテーブル名を間違えずに打ち込むのが大変なときなどに、役立ちます。
mysql> show columns from employees like 'emp%'; +--------+------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +--------+------+------+-----+---------+-------+ | emp_no | int | NO | PRI | NULL | | +--------+------+------+-----+---------+-------+
desc テーブル名でも、全く同様の出力になります。短くてタイプが楽ですが、likeによるワイルドカード指定はできません。
また、mysqlshowコマンドでも、カラムのデータ型の確認が可能です。
【関連記事】
▶MySQLのデータベース一覧確認は、show databasesよりmysqlshowが便利
データ型の変更は、alter table
データ型の変更をおこなうSQLの構文は以下の通りです。
ALTER TABLE テーブル名 MODIFY カラム名 データ型
変更前のテーブルemployees(社員テーブル)の各カラムのデータ型は以下の通りです。
mysql> desc employees; +------------+---------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +------------+---------------+------+-----+---------+-------+ | emp_no | int | NO | PRI | NULL | | | birth_date | date | NO | | NULL | | | first_name | varchar(50) | YES | | NULL | | | last_name | varchar(16) | NO | | NULL | | | gender | enum('M','F') | NO | | NULL | | | hire_date | date | NO | | NULL | | +------------+---------------+------+-----+---------+-------+
last_name(姓名の姓)のデータ型をvarchar(16)から、vachar(50)に変更してみましょう。
NOT NULL制約が設定されているカラムに対してデータ型の変更を行うと、NOT NULL制約が解除されます。
mysql> alter table employees modify last_name varchar(50); Query OK, 0 rows affected (2.90 sec) Records: 0 Duplicates: 0 Warnings: 0 mysql> desc employees; +------------+---------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +------------+---------------+------+-----+---------+-------+ | emp_no | int | NO | PRI | NULL | | | birth_date | date | NO | | NULL | | | first_name | varchar(50) | YES | | NULL | | | last_name | varchar(50) | YES | | NULL | | | gender | enum('M','F') | NO | | NULL | | | hire_date | date | NO | | NULL | | +------------+---------------+------+-----+---------+-------+
last_nameの「Null」の項目がNOからYESに変化しているのが確認できます。
以下のように指定すると、NOT NULL制約を設定したままデータ型を変更可能です。
mysql> alter table employees modify last_name varchar(50) not null; Query OK, 0 rows affected (2.91 sec) Records: 0 Duplicates: 0 Warnings: 0 mysql> desc employees; +------------+---------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +------------+---------------+------+-----+---------+-------+ | emp_no | int | NO | PRI | NULL | | | birth_date | date | NO | | NULL | | | first_name | varchar(50) | YES | | NULL | | | last_name | varchar(50) | NO | | NULL | | | gender | enum('M','F') | NO | | NULL | | | hire_date | date | NO | | NULL | | +------------+---------------+------+-----+---------+-------+
なお、外部キー(foreign key)として設定されているカラムは、データ型の変更ができません。いったん外部キーを解除してから、変更を行いましょう。
mysql> alter table employees modify emp_no varchar(10); ERROR 3780 (HY000): Referencing column 'emp_no' and referenced column 'emp_no' in foreign key constraint 'dept_emp_ibfk_1' are incompatible.
まとめ
- MySQLのデータ型は、大別すると数値型、日付・時刻型、文字列型の3種類。
- データ型を確認するには、show columns(SQL)や、mysqlshowコマンドを使う
- データ型変更は、alter tableで可能