- MySQL
MySQL CSVインポート|LOAD DATA INFILEとエラー解決
MySQLでCSVを取り込むいちばん速い方法は LOAD DATA INFILE 文で、サーバー上のファイルなら secure_file_priv の場所に置く、手元のファイルなら LOCAL を付けてサーバーとクライアントの両方で local_infile を有効にする、の2択です。 ここを取り違えると ERROR 1290・ERROR 3948・ERROR 2068 が出ます。
この記事では、MySQL 8.0.46 で実際にエラーを全部再現し、直したあとの実行結果まで載せています。区切り文字・囲み文字・改行・文字コードのオプション一覧、Windows(CRLF)やShift_JISのCSV、SELECT ... INTO OUTFILE での書き出し、そして 20万件のCSVを LOAD DATA・mysqlimport・Python(PyMySQL)で取り込んだ速度比較 もまとめました。
MySQL 8.0 は2026年4月にサポートが終了しています。この記事の手順は MySQL 8.4 LTS/9.7 でも同じ構文・同じ設定で使えます(8.4のリファレンスでも
local_infileは既定で無効、secure_file_privの仕様も同じです)。違いがある箇所は本文で注記します。検証は手元の 8.0 で行いました。
MySQL CSVインポートの早見表
| やりたいこと | 使う書き方 | 必要な設定 |
|---|---|---|
| サーバー上のCSVを取り込む | LOAD DATA INFILE '/path/x.csv' INTO TABLE t ... |
ファイルを secure_file_priv のディレクトリに置く+FILE 権限 |
| 手元(クライアント側)のCSVを取り込む | LOAD DATA LOCAL INFILE 'x.csv' INTO TABLE t ... |
サーバー local_infile=ON かつ クライアント --local-infile=1 |
| 1行目の見出しを飛ばす | IGNORE 1 LINES |
― |
| カンマ区切り・ダブルクォート囲み | FIELDS TERMINATED BY ',' ENCLOSED BY '"' |
― |
| Windows改行(CRLF)のCSV | LINES TERMINATED BY '\r\n' |
― |
| Shift_JIS(Excel保存)のCSV | CHARACTER SET cp932 |
― |
| 空文字をNULLにする・日付を変換する | 列を @変数 で受けて SET col = NULLIF(@v,'') |
― |
| 型が合わない行を警告にして続行 | LOAD DATA INFILE ... IGNORE INTO TABLE t |
― |
| 同じ主キーは上書き | LOAD DATA INFILE ... REPLACE INTO TABLE t |
― |
| テーブルをCSVに書き出す | SELECT ... INTO OUTFILE '/path/x.csv' |
secure_file_priv 配下+mysqldが書き込めること |
| シェルから取り込む | mysqlimport --local --fields-terminated-by=',' DB x.csv |
ファイル名=テーブル名 |
| 設定を確認する | SELECT @@secure_file_priv, @@local_infile; |
― |
本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。
(記載例)出典:株式会社RJC「MySQL CSVインポート|LOAD DATA INFILEとエラー解決」
検証環境とサンプルCSV
- MySQL 8.0.46(Ubuntu 24.04 パッケージ)、
mysqlクライアント 8.0.46 - Python 3.11 + PyMySQL 2.2.8
- サーバーは
--secure-file-priv=/tmp/t108filesを指定して起動(後述)
取り込むテーブルとCSVです。2行目に「カンマを含む名前」、3行目に「ダブルクォートを含む名前・スラッシュ区切りの日付・空のポイント」をわざと入れています。
CREATE DATABASE shop CHARACTER SET utf8mb4;
USE shop;
CREATE TABLE members (
id INT PRIMARY KEY,
name VARCHAR(20),
email VARCHAR(100),
joined_on DATE,
points INT
);
id,name,email,joined_on,points
1,佐藤 花子,hanako@example.com,2026-04-01,120
2,"鈴木, 一郎",ichiro@example.com,2026-05-15,80
3,"田中 ""タナ"" 次郎",jiro@example.com,2026/06/30,
4,高橋 美咲,misaki@example.com,2026-07-07,300
LOAD DATA INFILE と LOCAL INFILE の違い
LOCAL なしは「サーバーのmysqldが自分のディスクから読む」、LOCAL ありは「クライアントがファイルを読んでサーバーへ送る」という違いです。 どちらを使うかで、必要な設定もエラーの出方も変わります。
判断表:どちらを使い、何を設定するか
| 項目 | LOAD DATA INFILE | LOAD DATA LOCAL INFILE |
|---|---|---|
| ファイルを読むのは | サーバー(mysqldのOSユーザー) | クライアント |
| ファイルの置き場所 | サーバーの secure_file_priv 配下 |
クライアントのどこでも |
| サーバー側の設定 | secure_file_priv(再起動が必要) |
local_infile=ON(動的に変更可) |
| クライアント側の設定 | 不要 | --local-infile=1(ドライバなら local_infile=True 等) |
| 必要な権限 | FILE 権限+テーブルの INSERT |
テーブルの INSERT |
| 型エラー時(strictモード) | エラーで全体が止まる | 警告にして続行(IGNORE 扱い) |
| 向いている場面 | DBサーバー上でのバッチ取り込み | 手元のCSV、マネージドDB(RDS等) |
| 8.4/9.7 | 同じ | 同じ(既定で無効) |
「エラー時の動き」が違う点は見落としやすいポイントです。 LOCAL はサーバーが途中でファイル転送を止められないため、重複キーや型変換の問題を警告にして続けます。不正な行を確実に止めたいときは、LOCAL なしで取り込むか、取り込み後に SHOW WARNINGS を必ず確認します。
設定は SELECT @@secure_file_priv, @@local_infile; で確認できます。secure_file_priv の値の意味は次のとおりです。
| 値 | 意味 |
|---|---|
ディレクトリ(例:/var/lib/mysql-files/) |
そのディレクトリの中だけ読み書きできる(パッケージ版・公式Dockerイメージの既定) |
| 空文字 | どこでも読み書きできる |
NULL |
LOAD DATA INFILE/INTO OUTFILE を使えない |
エラーを再現して直す
ERROR 1290:secure-file-priv の外のファイル
secure_file_priv 以外の場所にあるファイルを指定すると、次のエラーになります。
mysql> LOAD DATA INFILE '/home/claude/work/members.csv' INTO TABLE members
-> FIELDS TERMINATED BY ',' ENCLOSED BY '"' IGNORE 1 LINES;
ERROR 1290 (HY000): The MySQL server is running with the --secure-file-priv option so it cannot execute this statement
直し方は3つあり、上から順におすすめです。
| 方法 | 手順 | 再起動 |
|---|---|---|
| ① 許可されたディレクトリへコピーする | SELECT @@secure_file_priv; で場所を確認し、そこへ cp |
不要 |
② LOCAL に切り替える |
次の節の local_infile 設定を行う |
不要 |
| ③ 許可ディレクトリを変える | my.cnf の [mysqld] に secure_file_priv=/data/import |
必要 |
secure_file_priv は読み取り専用の変数で、SET GLOBAL や SET PERSIST では変えられません。③は設定ファイルに書いて再起動します。
[mysqld]
secure_file_priv = /data/import
検証では --secure-file-priv=/tmp/t108files で起動し直し(@@secure_file_priv が /tmp/t108files/ に変わることを確認)、そこへコピーしてから取り込みました。
ERROR 3948:Loading local data is disabled
サーバーの local_infile が OFF のまま LOCAL を使うと出ます。クライアントで --local-infile=1 を付けていても同じでした。
$ mysql -uroot --local-infile=1 shop -e "LOAD DATA LOCAL INFILE 'members.csv' INTO TABLE members ..."
ERROR 3948 (42000) at line 1: Loading local data is disabled; this must be enabled on both the client and server sides
サーバー側を有効にします。SET PERSIST なら再起動後も残ります。
SET PERSIST local_infile = ON;
公式リファレンス(8.4)では、クライアント側で無効なときのエラーとして
ERROR 3950も記載されています。番号は違っても、メッセージの意味は「サーバーとクライアントの両方で有効にする」で同じです。
ERROR 2068:file request rejected due to restrictions on access
サーバー側を有効にしても、クライアント側が既定の無効のままだと次のエラーになります。
$ mysql -uroot shop -e "LOAD DATA LOCAL INFILE 'members.csv' INTO TABLE members ..."
ERROR 2068 (HY000) at line 1: LOAD DATA LOCAL INFILE file request rejected due to restrictions on access.
mysql --help で確認すると local-infile の既定値は FALSE でした。mysql -uroot --local-infile=1 shop のように付けて接続すると通ります。
読ませるディレクトリを限定したいときは --load-data-local-dir=/data/csv が便利です。 local-infile を有効にせず、指定ディレクトリ配下だけを許可できます。設定ファイルに書くなら [client] か [mysql] セクションに local_infile=1 を書きます。
ERROR 1366/1265/1262/1406:データが列に合わない
LOCAL なし(strictモード)でサンプルCSVをそのまま取り込むと、3行目の空のポイントで止まります。
mysql> LOAD DATA INFILE '/tmp/t108files/members.csv' INTO TABLE members
-> FIELDS TERMINATED BY ',' ENCLOSED BY '"' IGNORE 1 LINES;
ERROR 1366 (HY000): Incorrect integer value: '' for column 'points' at row 3
mysql> SELECT COUNT(*) FROM members; -- 結果は 0
InnoDBでは文全体が取り消されるため、1件も入っていません。 途中まで入って中途半端になる心配はありません。
ほかのよくあるエラーも再現しました。
| エラー | 原因になったCSV | 実際のメッセージ |
|---|---|---|
| ERROR 1366 | 数値列に abc |
Incorrect integer value: 'abc' for column 'points' at row 1 |
| ERROR 1406 | VARCHAR(20) に20文字超の名前 |
Data too long for column 'name' at row 1 |
| ERROR 1262 | 列が1つ多い行 | Row 1 was truncated; it contained more data than there were input columns |
| ERROR 1300 | Shift_JISのCSVをutf8mb4として読んだ | Invalid utf8mb4 character string: '' |
IGNORE を付けると、エラーは警告(Warning)になって取り込みが続きます。長すぎる名前は 20文字で切り捨てられ、1265 Data truncated の警告が出ました。
mysql> LOAD DATA INFILE '/tmp/t108files/long.csv' IGNORE INTO TABLE members
-> FIELDS TERMINATED BY ',' IGNORE 1 LINES;
mysql> SHOW WARNINGS;
Warning | 1265 | Data truncated for column 'name' at row 1
mysql> SELECT id, name FROM members WHERE id = 5;
5 | とても長い名前がここに入って二十文字を超
IGNORE はデータを黙って変えることがあるので、使ったら必ず SHOW WARNINGS を見ます。 本来は列の型・長さを見直すか、次の「列指定と SET」で変換してから入れるのが確実です。
直した後:列指定と SET で変換して取り込む
CSVの値をいったんユーザー変数(@joined、@points)で受け取り、SET で変換してから列に入れます。
LOAD DATA INFILE '/tmp/t108files/members.csv'
INTO TABLE members
CHARACTER SET utf8mb4
FIELDS TERMINATED BY ',' ENCLOSED BY '"'
LINES TERMINATED BY '\n'
IGNORE 1 LINES
(id, name, email, @joined, @points)
SET joined_on = STR_TO_DATE(REPLACE(@joined, '/', '-'), '%Y-%m-%d'),
points = NULLIF(@points, '');
id name email joined_on points
1 佐藤 花子 hanako@example.com 2026-04-01 120
2 鈴木, 一郎 ichiro@example.com 2026-05-15 80
3 田中 "タナ" 次郎 jiro@example.com 2026-06-30 NULL
4 高橋 美咲 misaki@example.com 2026-07-07 300
警告は0件でした。カンマ入りの名前は ENCLOSED BY '"' で、"" は " に戻り、空のポイントは NULLIF で NULL になっています。
2026/06/30をそのまま DATE 列に入れると、8.0.46 では取り込めたうえでWarning 4095 Delimiter '/' in position 4 in datetime value ... is deprecatedが出ました。区切り文字は-にそろえておくと、8.4/9.7 へ移っても安心です。
LOAD DATA のオプション一覧
| 句 | 既定値 | 意味・使いどころ |
|---|---|---|
LOCAL |
なし | クライアント側のファイルを送る |
REPLACE / IGNORE |
なし | 主キー重複を上書き/重複・型エラーを警告にして続行 |
CHARACTER SET cs |
character_set_database |
ファイルの文字コード(utf8mb4、cp932 など) |
FIELDS TERMINATED BY |
'\t' |
列の区切り。CSVは ',' |
FIELDS [OPTIONALLY] ENCLOSED BY |
'' |
値の囲み文字。CSVは '"' |
FIELDS ESCAPED BY |
'\\' |
エスケープ文字。\N はNULLとして読む |
LINES STARTING BY |
'' |
行頭の接頭辞を読み飛ばす |
LINES TERMINATED BY |
'\n' |
行の区切り。Windowsは '\r\n' |
IGNORE n LINES |
0 | 先頭n行(見出し)を飛ばす |
(col, @var, ...) |
全列を順に | CSVの列とテーブル列の対応。不要な列は @dummy で捨てる |
SET col = 式 |
なし | 変数を変換して入れる |
既定値はタブ区切り・\n 改行なので、CSVでは FIELDS TERMINATED BY ',' を毎回書く と覚えておくと迷いません。
ESCAPED BY と NULL の扱い
既定(ESCAPED BY '\\')では \N が NULL になり、\t \n もタブ・改行に変換されます。 空の値(,,)は空文字で、数値列では strict モードだとエラーです。ENCLOSED BY を指定していれば、囲みなしの NULL という文字も NULL として読まれます。Windowsのパス(C:\data)を含むCSVは ESCAPED BY '' にすると \ が残ります。
Windows改行(CRLF)とShift_JISのCSV
CRLF のまま \n で読むと末尾に \r が残る
Excelや、Pythonの csv.writer(既定の改行は \r\n)で作ったCSVは行末が CRLF です。LINES TERMINATED BY '\n' のまま読むと、最後の列に \r(0x0D)が付いたまま入ります。
-- 最後の列を文字列で受けたテーブルで確認
LOAD DATA INFILE '/tmp/t108files/crlf_utf8.csv' INTO TABLE m3
FIELDS TERMINATED BY ',' IGNORE 1 LINES;
SELECT id, memo, HEX(memo), LENGTH(memo) FROM m3;
id memo HEX(memo) LENGTH(memo)
11 50 35300D 3
12 60 36300D 3
見た目は 50 でも長さは3です。最後の列が DATETIME の場合は、20万件すべてで次の警告が出ました。
Warning 4096 Delimiter '\r' in position 19 in datetime value '2026-01-01 00:01:00' at row 1 is superfluous and is deprecated. Please remove.
LINES TERMINATED BY '\r\n' を指定すると警告は0件になります。 改行コードは file x.csv(with CRLF line terminators と出る)や od -c x.csv | head で確認できます。
Shift_JIS(cp932)のCSV
Excelで「CSV(コンマ区切り)」保存したファイルはShift_JIS系です。utf8mb4として読むと ERROR 1300 Invalid utf8mb4 character string で止まります。CHARACTER SET cp932 を指定すると、utf8mb4のテーブルへ正しく変換して入ります。
LOAD DATA INFILE '/tmp/t108files/sjis_crlf.csv'
INTO TABLE m2
CHARACTER SET cp932
FIELDS TERMINATED BY ','
LINES TERMINATED BY '\r\n'
IGNORE 1 LINES;
id name email joined_on points
11 中村 健 ken@example.com 2026-09-01 50
12 小林 舞 mai@example.com 2026-09-02 60
取り込み後に
SELECTすると?? ??と表示されることがあります。検証環境では保存データは正しく(HEX(name)がE4BD90E897A4...の UTF-8)、表示側のクライアント文字コードが latin1 だったことが原因でした。mysql --default-character-set=utf8mb4で接続し直すと正しく表示されます。
SELECT ... INTO OUTFILE でCSVに書き出す
取り込みと対になる書き出しです。MySQLの INTO OUTFILE は見出し行を出さないため、UNION ALL で1行目に見出しを足します。
SELECT 'id','name','email','joined_on','points'
UNION ALL
SELECT id, name, email, joined_on, points FROM members
INTO OUTFILE '/tmp/t108files/members_out.csv'
CHARACTER SET utf8mb4
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'
LINES TERMINATED BY '\n';
"id","name","email","joined_on","points"
"1","佐藤 花子","hanako@example.com","2026-04-01","120"
"2","鈴木, 一郎","ichiro@example.com","2026-05-15","80"
"3","田中 \"タナ\" 次郎","jiro@example.com","2026-06-30",\N
"4","高橋 美咲","misaki@example.com","2026-07-07","300"
出力から読み取れるポイントは3つです。
- NULL は
\Nで出ます。同じオプションでLOAD DATAすれば NULL に戻ります。 "は\"とエスケープされます(Excel流の""ではありません)。ESCAPED BY '"'にすると"田中 ""タナ"" 次郎"になりますが、NULL が"Nと出たため、Excel向けはIFNULL(col,'')で空文字にしてから出すと扱いやすいです。- 見出しを
UNION ALLすると全列が文字列扱いになり、数値も"120"と囲まれます。
書き出しでつまずいたエラーも載せます。
| エラー | 原因 | 対処 |
|---|---|---|
ERROR 1290 ... --secure-file-priv |
許可ディレクトリの外 | @@secure_file_priv の配下に出力する |
ERROR 1 ... Can't create/write to file ... (OS errno 13 - Permission denied) |
mysqld の実行ユーザー(検証では mysql)がディレクトリに書けない |
ディレクトリの所有者・権限を mysqld が書けるように変える |
ERROR 1086 File '...' already exists |
同名ファイルがある(上書きはしない仕様) | ファイル名に日時を入れる、事前に削除する |
出力されたファイルの所有者は mysqld の実行ユーザー(-rw-r----- mysql mysql)です。 別ユーザーで扱う場合は権限に注意します。手元にCSVがほしいだけなら、mysql -B -e "SELECT ..." > out.tsv のようにクライアント側で受けると secure_file_priv の制約を受けません(クライアントの使い方は「MySQLコマンド一覧」の記事で扱っています)。
mysqlimport:シェルから1行で取り込む
mysqlimport は LOAD DATA をコマンドラインから実行するラッパーです。ファイル名(拡張子を除く)がそのままテーブル名になります。
mysqlimport -uroot --local \
--fields-terminated-by=',' \
--fields-optionally-enclosed-by='"' \
--lines-terminated-by='\r\n' \
--ignore-lines=1 \
--default-character-set=utf8mb4 \
shop orders.csv
shop.orders: Records: 200000 Deleted: 0 Skipped: 0 Warnings: 0
最初の実行では --lines-terminated-by を付け忘れ、Warnings: 200000 と表示されました(前述の \r の警告)。Warnings が0でないときは中身を確認する のがおすすめです。
Pythonから取り込む方法と速度比較
20万件(約8.8MB、5列)の注文CSVで、取り込み方法ごとの時間を測りました。テーブルは毎回 TRUNCATE し、同じマシン・ソケット接続です。
# import_py.py(Python 3.11 / PyMySQL 2.2.8)
import csv, time
import pymysql
conn = pymysql.connect(unix_socket="/tmp/t108my/mysql.sock", user="root", database="shop",
charset="utf8mb4", local_infile=True) # LOCAL を使うなら True
INSERT = "INSERT INTO orders (id, member_id, item, qty, ordered_at) VALUES (%s,%s,%s,%s,%s)"
def load_data_local(cur):
cur.execute("LOAD DATA LOCAL INFILE %s INTO TABLE orders "
"FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '\"' "
"LINES TERMINATED BY '\\r\\n' IGNORE 1 LINES", ("orders.csv",))
def rows():
with open("orders.csv", newline="", encoding="utf-8") as f:
r = csv.reader(f); next(r)
yield from r
def executemany_batch(cur, batch=5000):
buf = []
for row in rows():
buf.append(row)
if len(buf) == batch:
cur.executemany(INSERT, buf); buf.clear()
if buf:
cur.executemany(INSERT, buf)
def execute_each(cur):
for row in rows():
cur.execute(INSERT, row)
for name, fn in [("LOAD DATA LOCAL", load_data_local),
("executemany(5000件ずつ)", executemany_batch),
("1行ずつexecute", execute_each)]:
with conn.cursor() as cur:
cur.execute("TRUNCATE orders")
t = time.perf_counter()
fn(cur); conn.commit()
el = time.perf_counter() - t
cur.execute("SELECT COUNT(*) FROM orders")
print(f"{name}: {el:.2f} 秒 / {cur.fetchone()[0]} 件")
LOAD DATA LOCAL: 1.47 秒 / 200000 件
executemany(5000件ずつ): 3.03 秒 / 200000 件
1行ずつexecute: 28.41 秒 / 200000 件
シェルからの3方式も含め、それぞれ2回実行した結果です。
| 方法 | 20万件の時間(実測) | 設定の手間 |
|---|---|---|
LOAD DATA INFILE(サーバー上のファイル) |
0.99〜1.22秒 | secure_file_priv・FILE権限 |
LOAD DATA LOCAL INFILE(mysqlクライアント) |
1.02〜1.14秒 | local_infile 両側 |
mysqlimport --local |
0.99〜1.15秒 | local_infile 両側 |
Python:LOAD DATA LOCAL(PyMySQL) |
1.05〜1.47秒 | local_infile=True |
Python:executemany(5,000件ずつ) |
2.80〜3.03秒 | 不要 |
Python:1行ずつ execute |
25.09〜28.41秒 | 不要 |
LOAD DATA 系はどれも1〜1.5秒で、1行ずつINSERTの約20倍の速さでした。 executemany はPyMySQLが複数行の INSERT ... VALUES (...),(...) にまとめて送るため、設定なしでも十分速い選択肢です。値の検証や加工をPython側でしたい場合は executemany、大量データをそのまま入れるなら LOAD DATA という使い分けがわかりやすいです。
よくある質問
Q. secure_file_priv を空文字にしてどこからでも読めるようにしてもよいですか?
A. 動作はしますが、mysqldがサーバー上の任意のファイルを読み書きできる状態になります。取り込み専用ディレクトリを決めて secure_file_priv に指定するか、LOCAL + --load-data-local-dir で範囲を絞る方法がおすすめです。
Q. Amazon RDS や Cloud SQL では LOAD DATA INFILE を使えますか?
A. マネージドDBはサーバーのファイルシステムに直接置けないため、LOAD DATA LOCAL INFILE を使います。パラメータグループ等で local_infile を有効にし、クライアント側も --local-infile=1 にします。
Q. MySQL 8.4/9.7 に上げたら書き方は変わりますか?
A. LOAD DATA の構文、secure_file_priv、local_infile(既定で無効)は同じで、この記事のSQLはそのまま使えます。8.0で警告として出ていた日付の区切り文字(/ や末尾の \r)は、今のうちに - と正しい改行指定にそろえておくと移行がスムーズです。
まとめ
- サーバー上のCSVは
LOAD DATA INFILE+secure_file_priv配下、手元のCSVはLOCAL+両側のlocal_infile - ERROR 1290 は置き場所、3948 はサーバー側、2068 はクライアント側の設定が原因
- CSVでは
FIELDS TERMINATED BY ','・ENCLOSED BY '"'・IGNORE 1 LINESを毎回書く - CRLFは
LINES TERMINATED BY '\r\n'、Shift_JISはCHARACTER SET cp932 - 空文字や日付の形式は
@変数とSETで変換してから入れる LOCALやIGNOREは警告で続行するので、SHOW WARNINGSと件数照合をセットに- 20万件で LOAD DATA は1〜1.5秒、1行ずつINSERTは25〜28秒。大量データは LOAD DATA が向いています
本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。
(記載例)出典:株式会社RJC「MySQL CSVインポート|LOAD DATA INFILEとエラー解決」
株式会社RJCでは、MySQLのデータ取り込みの手順を仲間と学び合っています。こうした知識を共有しながら、日々技術を磨いています。
株式会社RJC ― SI事業・SES事業・AI駆動開発。RJCは一緒に成長を楽しめる会社です。
WE ARE HIRING
RJCで一緒に開発しながら、
成長を楽しみませんか?
RJCは、Web・モバイル・AIを活用した開発プロジェクトで、テックリードやPM・PMOも活躍するシステム開発会社です。会社を知る、待遇を確かめる、話を聞いてみる。気になるところ見てみてください!
- 127日年間休日
- 12時間平均残業時間
- 毎日ガチャ遊びココロも大切にする福利厚生。アマギフなどの賞品ラインナップ!
ほかにも、チケットレストラン、書籍読み放題、2年ごとの慰労報奨(休暇 or 金一封)、11期連続の黒字決算。