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期連続の黒字決算。

ABOUT RJC RJCがどんな会社か知る 考え方、研修、働き方、福利厚生、社員の前職まで。RJCのことが丸わかり! RJC丸わかりページへ JOB DESCRIPTION 仕事内容・待遇を見てみる 仕事内容、給与・待遇、選考の流れ。経験者も未経験も!応募前に知りたいこと、まとめました! 募集要項を見る ENTRY エントリーする エントリーは1〜2分・履歴書不要です。まずは話を聞いてみたい、という方でも歓迎です! エントリーフォームへ

RJCで一緒に開発しながら、 成長を楽しみませんか?