概要
MySQLでCSVファイルをインポートする手順。
要点は以下の通り。
- CSVファイルはUTF-8(BOMなし)で準備する
- 改行コードに注意
- MySQLサーバーとクライアントの両方でローカルのファイル入力の許可が必要
- クライアントはログイン時のオプションで、サーバー側はグローバル変数で設定する
CSVファイルの準備
CSVファイルを準備し、MySQLで読み込む場所に配置する。CSV作成時の型と文字コードに注意。
型に関する注意点
数字だが001
のように表現したい場合は文字列として扱う。
- Excelの列の形式で適切な型を設定する
日付・時刻形式の空白値に注意。
- 日付・時刻値の列に空のデータがある場合にMySQLの
date/time/datetime
で読み込むと、NULL
値ではなく'0000-00-00'
や'0000-00-00 00:00:00'
で埋められてしまう
文字コードの注意点
CSVファイルはUTF-8のBOMなしで準備する。
- ExcelのシートをCSVファイルとして保存すると、UTF-8(BOMあり)になるので、メモ帳などで開いてBOMなしで保存し直す必要がある
MySQLログイン時のオプション
MySQLにログインするクライアントで、ローカルのファイル入力を許可する必要がある。
ログイン時に以下のオプションのいずれかを付ける
--enebale-local-infile
--local_infile=1またはon
1 |
$ mysql -u root -p --enable-local-infile |
MySQLログイン後の設定
グローバル変数の確認
SELECT
かSHOW GLOBAL VARIABLES
でlocal_infile
の値を確認。この値が0/OFF
の場合は許可されていない。以下のいずれかで確認できる。
SELECT @@local_infile;
1 2 3 4 5 6 7 |
mysql> SELECT @@local_infile; +----------------+ | @@local_infile | +----------------+ | 0 | +----------------+ 1 row in set (0.00 sec) |
SHOW GLOBAL VARIABLES LIKE 'local_infile';
1 2 3 4 5 6 7 |
mysql> SHOW GLOBAL VARIABLES LIKE 'local_infile'; +---------------+-------+ | Variable_name | Value | +---------------+-------+ | local_infile | OFF | +---------------+-------+ 1 row in set (0.01 sec) |
グローバル変数の設定
SET GLOBAL
でlocal_infile
の値を1
またはON
にセットする。
SET GLOBAL local_infile=1またはON;
1 2 3 4 5 6 7 8 9 10 |
mysql> SET GLOBAL local_infile=1; Query OK, 0 rows affected (0.00 sec) mysql> SELECT @@local_infile; +----------------+ | @@local_infile | +----------------+ | 1 | +----------------+ 1 row in set (0.00 sec) |
インポート実行
テーブルの準備
CSVの各カラムに対応した構造で、空のテーブルを準備しておく。
LOAD DATAの実行
SQLの例
CSVファイルをテーブルにインポートするSQLの例。
1 2 3 4 5 6 7 8 |
LOAD DATA LOCAL INFILE "ファイルパス" INTO TABLE テーブル名 FIELDS TERMINATED BY ',' LINES TERMINATED BY "\r\n" IGNORE 1 LINES ; |
この例では、WindowsのようにCRLFで改行されたファイルを読み込み、区切り文字がカンマのCSVとして、先頭1行を飛ばして読み込む。
FIELDS
TERMINATED BY
- CSV保存時に選んだ区切り文字を指定する。1文字である必要はない。デフォルトは
'\t'
。 ENCLOSED BY
- フィールドを囲み文字を1文字で指定する。デフォルトは
''
(空)で、フィールドが区切り文字で囲まれていることを期待しない。OPTIONALLY
を付けると文字列のみ囲み文字で囲まれていることを期待する。 ESCAPED BY
- エスケープ文字を1文字で指定する。エスケープ文字に続く文字がエスケープシーケンスとして解釈される。デフォルトは
'\\'
で'\'
一文字を表している。
LINES
STARTING BY
- 指定したprefix以降のみ行として扱い、それ以外はスキップする。prefixは1文字でなくてもよい。デフォルトは
''
でprefixを設定していない(常に行頭から読み込む)。 TERMINATED BY
- 行末の文字列を指定する。デフォルトは
'\n'
。
IGNORE
IGNORE 数値 lines/rows
で、先頭の指定した数の行/列を読み込まない。