MySQL
 Computer >> コンピューター >  >> プログラミング >> MySQL

テキストファイルからMySQLテーブルへデータをインポートする際のエスケープ文字(\)の使い方

MySQLにテキストファイルからデータをインポートする際、フィールドの値の中にカンマ(,)などの区切り文字と同じ記号が含まれている場合、エスケープ文字(\)の使用が非常に重要になります。エスケープ文字を使わないと、MySQLは値を正しく判別できず、意図しない列にデータが格納されてしまいます。

具体的な例で確認してみましょう。以下のようなデータを持つテキストファイル「A.txt」をMySQLのテーブルにインポートするケースを考えます。

id,   Name,      Country,       Salary
105,  Chum,      Marsh,USA,     11000
106,  Danny,     Harrison,AUS,  12000

このファイルでは、「Name」フィールドに「名前」と「姓」がカンマで区切られて格納されています。しかし、フィールドの区切り文字もカンマであるため、問題が発生します。次のクエリで、このテキストファイル「A.txt」のデータを「employee4_tbl」テーブルにインポートしてみます。

mysql> LOAD DATA LOCAL INFILE 'd:\A.txt' INTO table employee4_tbl FIELDS TERMINATED BY ',' IGNORE 1 ROWS;
Query OK, 2 rows affected, 4 warnings (0.05 sec)
Records: 2 Deleted: 0 Skipped: 0 Warnings: 4

実行結果を見ると、4件の警告(warnings)が発生していることがわかります。実際にテーブルにどのようなデータが挿入されたのか、次のクエリで確認してみましょう。

mysql> Select * from employee4_tbl;
+------+---------+----------+--------+
| Id   | Name    | Country  | Salary |
+------+---------+----------+--------+
| 105  | Chum    | Marsh    |      0 |
| 106  | Danny   | Harrison |      0 |
+------+---------+----------+--------+
2 rows in set (0.00 sec)

上記の結果セットから、MySQLが「Name」フィールドの値だった「姓」(lastname)を「Country」フィールドの値として誤って解釈してしまったことがわかります。その結果、「Salary」には数値として解釈できない値が入り、0が格納されてしまいました。

エスケープ文字による問題の解決

この問題は、テキストファイル内でフィールドの値に含まれるカンマの直前にエスケープ文字(\)を付けることで解決できます。修正後のテキストファイルは以下のようになります。

id,     Name,     Country,        Salary
105,    Chum\,    Marsh,USA,      11000
106,    Danny\,   Harrison,AUS,   12000

このように「Chum\,」「Danny\,」とすることで、カンマがフィールドの区切り文字ではなく、値の一部であることをMySQLに伝えられます。それでは、修正したテキストファイルを次のクエリでMySQLテーブルにインポートしてみます。

mysql> LOAD DATA LOCAL INFILE 'd:\A.txt' INTO table employee5_tbl FIELDS TERMINATED BY ',' IGNORE 1 ROWS;
Query OK, 2 rows affected (0.03 sec)
Records: 2 Deleted: 0 Skipped: 0 Warnings: 0

先ほどとは異なり、今回は警告が一切発生していません。実際にインポートされたデータを確認してみましょう。

mysql> Select * from employee5_tbl;
+------+----------------+----------+--------+
| Id   | Name           | Country  | Salary |
+------+----------------+----------+--------+
| 105  | Chum,Marsh     | USA      |  11000 |
| 106  | Danny,Harrison | AUS      |  12000 |
+------+----------------+----------+--------+
2 rows in set (0.00 sec)

今度は「Name」フィールドに「Chum,Marsh」「Danny,Harrison」というフルネームが正しく格納され、「Country」にも「USA」「AUS」、「Salary」にも正しい数値が入っていることが確認できます。

まとめ

LOAD DATA INFILE文でテキストファイルをインポートする際、フィールドの値の中に区切り文字と同じカンマが含まれる場合は、必ずエスケープ文字(\)を付けるようにしましょう。これにより、MySQLが各値を正しいフィールドに振り分けられるようになり、警告やデータの破損を防ぐことができます。

  1. SQL Serverでスラッシュ(/)を含むテーブル列をインポートする方法|BCPユーティリティの活用

    SAPなどの外部データベースからエクスポートされたテーブルでは、列名に「/」(スラッシュ)が含まれているケースがあり、そのままSQL Serverへインポートしようとするとエラーが発生することがあります。このような場合におすすめなのが、BCP(Bulk Copy Program)ユーティリティを使ったデータのインポート・エクスポートです。BCPユーティリティとはBCPはSQL Serverに標準搭載されているコマンドラインツールで、テーブルとテキストファイル(フラットファイル)間で大量のデータを高速にやり取りできます。テキストファイルを仲介することで、特殊文字を含む列名による問題を回避できるの

  2. MySQLでテーブルAとBを比較し、Bに存在しないデータをテーブルCに挿入する方法

    MySQL:テーブルAとBを比較し、Bに存在しないデータをCへ挿入する方法テーブルAのデータとテーブルBを比較し、Bに存在しないレコードだけをテーブルCに挿入したい場合は、LEFT JOIN(左外部結合)を使うのが最もシンプルで確実な方法です。ここでは、3つのテーブル(demo20=テーブルA、demo21=テーブルB、demo22=テーブルC)を使って、具体的な手順を順番に解説します。ステップ1:テーブルA(demo20)を作成するまず、比較元となる最初のテーブルを作成します。mysql> create table demo20 −> ( −> id