概要
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で、先頭の指定した数の行/列を読み込まない。