MySQL WorkbenchでcsvファイルをMySQL 5.7にロードするときに問題が発生します。
ESH13 1/2/2013 10:04:35 1451 1
ESH13 1/2/2013 10:04:35 1451.25 2
ESH13 1/2/2013 10:04:35 1451 1
ESH13 1/2/2013 10:04:35 1451 1
ESH13 1/2/2013 10:04:36 1451 1
ESH13 1/2/2013 10:04:36 1451 2
SHOW VARIABLES LIKE "secure_file_priv";
CREATE TABLE es (
id INT NOT NULL AUTO_INCREMENT,
ticker VARCHAR(255) NOT NULL,
date DATE NOT NULL,
time DECIMAL(10 , 2 ) NULL,
price DECIMAL(10 , 2 ) NULL,
vol DECIMAL(10 , 2 ) NULL,
PRIMARY KEY (id)
);
LOAD DATA INFILE 'C:\Users\YCM LLC\Desktop\HFT\ES_test.csv'
INTO TABLE es_test1
FIELDS TERMINATED BY ','
ENCLOSED BY '"'
LINES TERMINATED BY '\n';
上記の実行時にこのエラーが発生します:
エラーコード:1290。MySQLサーバーは--secure-file-privオプションで実行されているため、このステートメントを実行できません。
以下のようにステートメントをブロックしてC:\ProgramData\MySQL\MySQL Server 5.7\my.ini
を変更しようとしましたが、変更を保存しようとすると「Access is denied」が表示されます。
# Secure File Priv.
# secure-file-priv="C:/ProgramData/MySQL/MySQL Server 5.7/Uploads"
次に、LOAD DATA INFILEステートメントで「ローカル」キーワードを使用しようとしました:
LOAD DATA local INFILE 'C:\Users\YCM LLC\Desktop\HFT\ES_test.csv'
INTO TABLE es_test1
FIELDS TERMINATED BY ','
ENCLOSED BY '"'
LINES TERMINATED BY '\n';
上記の実行時にこのエラーが発生します:
エラーコード:2.ファイル「C:UsersYCM LLCDesktopHFTES_test.csv」が見つかりません(エラーコード:2-そのようなファイルまたはディレクトリはありません)
[a]コメントで質問に回答した人からのアドバイスに従って調整を行った後、データをロードすることができましたが、時間文字列データをテーブルにロードできなくなりました
CREATE TABLE es (
ticker VARCHAR(255) NOT NULL,
xdate DATE NOT NULL,
time Time NULL,
price DECIMAL(10 , 2 ) NULL,
vol DECIMAL(10 , 2 ) NULL
);
LOAD DATA local INFILE 'C:\\Users\\YCM LLC\\Desktop\\HFT\\ES_test.csv'
INTO TABLE es
FIELDS TERMINATED BY ','
ENCLOSED BY '"'
LINES TERMINATED BY '\n'
(ticker, @var1, @var2, price, vol)
SET xdate = STR_TO_DATE(@var1, '%m/%d/%Y'),
time = STR_TO_DATE(@var2, '%hh:%mm:%ss');
上記の実行時にこのエラーが発生します:
影響を受ける6行、6警告:1411関数str_to_dateの不正な日時値:'10:04:35 '1411関数str_to_dateの不正な日時値:'10:04:35' 1411不正な日時値:'10関数str_to_date 1411の:04:35 '不正な日時値:関数の'10:04:35'
ここでいくつかの問題が発生しているようです。解決するには、いくつかの調整を行って、データをエラーなしで読み込むことができます。
以下で詳細を参照し引用してソースを示したので、より詳細な説明について各項目を読むことができます。
簡単に言えば、基本的には次のことができます:
LOAD DATA INFILE
ステートメントでLOCAL
キーワードを使用して、my.ini
ファイルパラメータを調整する必要なく、MySQLでロードするデータを取得します。
LOAD DATA LOCAL INFILE '<file>'
最初のバックスラッシュをエスケープするには、1つではなく2つのバックスラッシュ[\\
]をフォルダーパスで個別のフォルダーに使用します。デフォルトでは、単一のバックスラッシュが特殊なエスケープ文字として使用され、単独で使用すると無視されます。
C:\\Users\\YCM LLC\\Desktop\\HFT\\ES_test.csv
STR_TO_DATE
関数を2番目の引数に渡し、最初の引数の時間値の形式を伝えて、%h:%i:%s
または%H:%i:%s
形式を使用する必要があります
time = STR_TO_DATE(@var2, '%h:%i:%s');
LOCAL
キーワードは、後で説明するように、ファイルの予想される場所とエラー処理に影響します。LOCAL
は、サーバーとクライアントの両方が許可するように構成されている場合にのみ機能します。たとえば、 mysqld がlocal_infile
システム変数を無効にして起動された場合、LOCAL
は機能しません。 セクション6.1.6、「LOAD DATA LOCALのセキュリティ問題」 を参照してください。
LOCAL
キーワードは、ファイルが見つかると予想される場所に影響します。
LOCAL
が指定されている場合、ファイルはクライアントホスト上のクライアントプログラムによって読み取られ、サーバーに送信されます。正確な場所を指定するために、ファイルに絶対パス名を指定できます。相対パス名として指定した場合、名前は、クライアントプログラムが起動されたディレクトリを基準にして解釈されます。
LOCAL
をLOAD DATA
とともに使用すると、ファイルのコピーがサーバーの一時ディレクトリに作成されます。これは、tmpdir
またはslave_load_tmpdir
の値によって決定されるディレクトリではなく、オペレーティングシステムの一時ディレクトリであり、MySQLサーバーでは構成できません。 (通常、システムの一時ディレクトリーは、Linuxシステムでは/tmp
、WindowsではC:\WINDOWS\TEMP
です。)このディレクトリーにコピー用の十分なスペースがないと、LOAD DATA LOCAL
ステートメントが失敗する可能性があります。
文字列内では、
NO_BACKSLASH_ESCAPES
SQLモードが有効になっていない限り、特定のシーケンスには特別な意味があります。これらのシーケンスはそれぞれ、エスケープ文字と呼ばれるバックスラッシュ(\
)で始まります。 MySQLは、 表9.1「特殊文字のエスケープシーケンス」 に示すエスケープシーケンスを認識します。他のすべてのエスケープシーケンスでは、バックスラッシュは無視されます。つまり、エスケープされた文字は、エスケープされなかったかのように解釈されます。表9.1特殊文字のエスケープシーケンス
エスケープシーケンス:
\\
シーケンスで表される文字:バックスラッシュ(
\
)文字
説明
MySQLのSTR_TO_DATE関数は文字列を受け取り、フォーマットマスクで指定された日付を返します。
構文
MySQLのSTR_TO_DATE関数の構文は次のとおりです。
STR_TO_DATE( string, format_mask )
パラメータまたは引数
string
日付としてフォーマットする文字列値。
format_mask
文字列に適用するフォーマット。以下は、format_maskパラメーターのオプションのリストです。これらのパラメーターは多くの組み合わせで使用できます。
ショートリスト
値:
%H
説明:時間(00から23)
値:
%h
説明:時間(00から12)
値:
%i
説明:分(00から59)
値:
%s
説明:秒(00から59)