13.2.6 LOAD DATA INFILE 구문
LOAD DATA [LOW_PRIORITY | CONCURRENT] [LOCAL] INFILE 'file_name
' [REPLACE | IGNORE] INTO TABLEtbl_name
[PARTITION (partition_name
,...)] [CHARACTER SETcharset_name
] [{FIELDS | COLUMNS} [TERMINATED BY 'string
'] [[OPTIONALLY] ENCLOSED BY 'char
'] [ESCAPED BY 'char
'] ] [LINES [STARTING BY 'string
'] [TERMINATED BY 'string
'] ] [IGNOREnumber
{LINES | ROWS}] [(col_name_or_user_var
,...)] [SETcol_name
=expr
,...]
LOAD DATA INFILE
문은 매우 빠르게 텍스트 파일에서 테이블에 행을 읽습니다. LOAD DATA INFILE
은 SELECT ... INTO OUTFILE
을 보완하는 것입니다. ( 섹션 13.2.9.1 "SELECT ... INTO 구문" 을 참조하십시오.) 테이블에서 파일에 데이터를 쓰려면 SELECT ... INTO OUTFILE
을 사용합니다. 그 파일을 테이블에 읽기 되돌리려면 LOAD DATA INFILE
을 사용합니다. FIELDS
및 LINES
절의 구문은 두 문장으로 동일합니다. 두 어구도 옵션이지만, 모두가 지정되는 경우 FIELDS
을 LINES
전에 지정해야합니다.
mysqlimport 유틸리티를 사용하여 데이터 파일을로드 할 수 있습니다. 이것은 LOAD DATA INFILE
문을 서버에 전송하여 작동합니다. --local
옵션을 지정하면 mysqlimport는 클라이언트 호스트에서 데이터 파일을 읽습니다. 클라이언트와 서버가 압축 된 프로토콜을 지원하는 경우 --compress
옵션을 지정하면 저속 네트워크의 성능을 향상시킬 수 있습니다. 섹션 4.5.5 "mysqlimport - 데이터 가져 오기 프로그램" 을 참조하십시오.
INSERT
및 LOAD DATA INFILE
의 효율 비교 및 LOAD DATA INFILE
의 고속화 대한 자세한 내용은 섹션 8.2.2.1 "INSERT 문의 속도" 를 참조하십시오.
파일 이름은 리터럴 문자열로 지정해야합니다. Windows에서는 경로 이름에서 백 슬래시를 슬래시 또는 이중 백 슬래시로 지정합니다. character_set_filesystem
시스템 변수는 파일 이름의 해석을 제어합니다.
MySQL 5.6.2 이후에서는 LOAD DATA
파티션 서브 파티션 또는 둘 중 하나 이상의 이름의 쉼표로 구분 된 목록을 포함 PARTITION
옵션을 사용하여 명시 적 파티션 선택을 지원하고 있습니다. 이 옵션이 사용되는 경우, 목록에서 지정되는 하나의 파티션 또는 서브 파티션에 파일에서 행을 삽입 할 수없는 경우이 문은 Found a row not matching the given partition set 오류로 실패합니다. 자세한 내용은 섹션 19.5 "파티션 선택" 을 참조하십시오.
테이블 잠금을 채용 한 스토리지 엔진 ( MyISAM
등)를 사용하여 파티션 된 테이블의 경우 LOAD DATA
는 어떤 파티션 잠금 삭제할 수 없습니다. 이것은 행 레벨 락을 채용 한 스토리지 엔진 ( InnoDB
등)을 사용하는 테이블에는 적용되지 않습니다. 자세한 내용은 섹션 19.6.4 "파티셔닝 및 잠금" 을 참조하십시오.
서버는 character_set_database
시스템 변수에 의해 표시된 문자 집합을 사용하여 파일의 정보를 해석합니다. SET NAMES
과 character_set_client
설정은 입력의 해석에 영향을주지 않습니다. 입력 파일의 내용에 기본값과 다른 문자 집합이 사용되는 경우는 일반적으로 CHARACTER SET
절을 사용하여 파일의 문자 집합을 지정하는 것이 좋습니다. binary
문자 집합은 "변환 없음"으로 지정합니다.
LOAD DATA INFILE
은 필드 값이로드되는 컬럼의 데이터 유형에 관계없이 파일 내의 모든 필드에 동일한 문자 집합이 할당 된 해석합니다. 파일의 내용이 정확하게 해석되도록 해당 파일이 올바른 문자 세트로 기록되어 있는지 확인해야합니다. 예를 들어, mysqldump -T를 사용하여 또는 mysql에서 SELECT ... INTO OUTFILE
문을 실행하여 데이터 파일을 쓸 경우 해당 파일이 LOAD DATA INFILE
에서로드 될 때 사용되는 문자 세트 출력이 기록 될 수 있도록 반드시 --default-character-set
옵션을 사용하십시오.
ucs2
, utf16
, utf16le
또는 utf32
문자 세트를 사용하는 데이터 파일을로드 할 수 없습니다.
LOW_PRIORITY
를 사용했을 경우, LOAD DATA
문 실행은 다른 어떤 클라이언트도 테이블에서 읽은 않을 때까지 지연됩니다. 이것은 테이블 수준 잠금만을 사용하는 스토리지 엔진 ( MyISAM
, MEMORY
및 MERGE
)에만 영향을 미칩니다.
병렬 삽입 충족 (즉, 중간에 빈 블록이 포함되지 않은) MyISAM
테이블에서 CONCURRENT
를 지정하면 다른 스레드는 LOAD DATA
의 실행 중에 테이블에서 데이터를 검색 할 수 있습니다. 이 옵션은 테이블이 다른 thread에서 동시에 사용되지 않은 경우에도 LOAD DATA
의 성능에 약간 영향을 미칩니다.
행 기반 복제는 CONCURRENT
는 MySQL 버전에 관계없이 복제됩니다. 문 기반 복제는 CONCURRENT
은 MySQL 5.5.1 이전에는 복제되지 않습니다 (Bug # 34628를 참조하십시오). 자세한 내용은 섹션 17.4.1.17 "복제 및 LOAD DATA INFILE" 를 참조하십시오.
LOCAL
키워드는 나중에 설명 된대로 파일의 예상 위치와 오류 처리에 영향을 미칩니다. LOCAL
은 서버와 클라이언트 모두가 그것을 허용하도록 구성되어있는 경우에만 작동합니다. 예를 들어, mysqld가 --local-infile=0
에서 시작 된 경우, LOCAL
는 기능하지 않습니다. 섹션 6.1.6 "LOAD DATA LOCAL의 보안 문제" 를 참조하십시오.
LOCAL
키워드는 파일을 찾을 것으로 예상되는 위치에 영향을줍니다.
LOCAL
이 지정되어있는 경우 파일은 클라이언트 호스트에서 클라이언트 프로그램에 의해 읽혀져 서버로 전송됩니다. 이 파일은 그 정확한 위치를 지정하기 위해 전체 경로 이름으로 지정할 수 있습니다. 상대 경로로 지정되는 경우, 그 이름은 클라이언트 프로그램이 실행 된 디렉토리를 기준으로 해석됩니다.LOCAL
을LOAD DATA
함께 사용하는 경우 해당 파일의 복사본이 서버의 임시 디렉토리에 생성됩니다. 이것은tmpdir
또는slave_load_tmpdir
값에 의해 결정되는 디렉토리가 아닌 운영 체제의 임시 디렉토리이며, MySQL Server에서 구성 할 수 없습니다. (시스템 임시 디렉토리는 일반적으로 Linux 시스템에서는/tmp
, Windows에서는C:\WINDOWS\TEMP
입니다.)이 디렉토리에 복사를위한 충분한 공간이 없으면LOAD DATA LOCAL
문이 실패 할 수 있습니다 .LOCAL
이 지정되어 있지 않은 경우, 파일은 서버 호스트에 있어야 직접 서버에 의해 읽혀집니다. 서버는 다음의 규칙을 사용하여 파일을 찾습니다.파일 이름이 절대 경로 이름 인 경우, 서버는 그것을 지정된대로 사용합니다.
파일 이름이 하나 이상의 선행 요소를 포함하는 상대 경로 이름 인 경우, 서버는 서버의 데이터 디렉토리를 기준으로 파일을 검색합니다.
선행 구성 요소를 포함하지 않는 파일 이름이 지정된 경우 서버는 기본 데이터베이스의 데이터베이스 디렉토리에서 파일을 찾습니다.
LOCAL
이외의 경우에는 이러한 규칙은 ./myfile.txt
라는 파일이 서버의 데이터 디렉토리에서 읽을 반면 myfile.txt
로 지정된 파일은 기본 데이터베이스의 데이터베이스 디렉토리에서 읽 수를 나타냅니다. 예를 들어, db1
이 기본 데이터베이스 인 경우 다음 LOAD DATA
문이 문이 명시 적으로 db2
데이터베이스의 테이블에 파일을로드하고 있음에도 불구하고 db1
데이터베이스 디렉토리에서 파일 data.txt
를 읽습니다.
LOAD DATA INFILE 'data.txt'INTO TABLE db2.my_table;
보안상의 이유로 서버에있는 텍스트 파일을 읽을 경우, 그 파일은 데이터베이스 디렉토리에 존재하거나 모든 사용자가 읽을 수 중 하나 여야합니다. 또한 서버 파일에 대해 LOAD DATA INFILE
을 사용하려면 FILE
권한이 필요합니다. 섹션 6.2.1 「MySQL에서 제공되는 권한 " 을 참조하십시오. LOCAL
이외의로드 조작은 secure_file_priv
시스템 변수가 비어 있지 않은 디렉토리 이름에 설정되어있는 경우로드 된 파일은 해당 디렉토리에 존재해야합니다.
LOCAL
을 사용하면 클라이언트가 연결을 통해 파일의 내용을 서버에 전송해야하기 때문에 서버가 직접 파일에 액세스 할 수 있도록 한 경우보다 조금 느립니다. 한편, 로컬 파일을로드하기 위해 FILE
권한이 필요하지 않습니다.
LOCAL
또한 오류 처리에도 영향을줍니다.
LOAD DATA INFILE
는 데이터 해석과 중복 키 오류로 인해 조작이 종료됩니다.LOAD DATA LOCAL INFILE
에서 조작 중에 파일 전송을 중지하는 방법이 서버는 않기 때문에 데이터 해석과 중복 키 오류 경고가 작업이 계속됩니다. 중복 키 오류 내용은이IGNORE
가 지정되어있는 경우와 동일합니다.IGNORE
내용은이 섹션의 나머지 분에 자세히 설명되어 있습니다.
REPLACE
및 IGNORE
키워드는 고유 키 값에 대해 기존 행을 복제하는 입력 행의 처리를 제어합니다.
REPLACE
를 지정했을 경우는 입력 행에 의해 기존 행이 바뀝니다. 즉, 기본 키 또는 고유 인덱스에 대해 기존 행과 동일한 값을 가진 행입니다. 섹션 13.2.8 "REPLACE 구문" 을 참조하십시오.IGNORE
를 지정했을 경우는 고유 키 값에 대해 기존 행을 복제하는 행이 삭제됩니다.두 옵션 모두 지정하지 않으면 그 동작은
LOCAL
키워드가 지정되어 있는지에 따라 다릅니다.LOCAL
이 지정되지 않은 경우 중복 키 값이 발견되면 오류가 발생하여 텍스트 파일의 나머지는 무시됩니다.LOCAL
이 지정되어있는 경우, 디폴트의 동작은IGNORE
이 지정되어있는 경우와 동일합니다. 이것은 조작 중에 파일 전송을 중지하는 방법이 서버는 않기 때문입니다.
로드 조작 중 외래 키 제약 조건을 무시하려면 LOAD DATA
를 실행하기 전에 SET foreign_key_checks = 0
문을 발행합니다.
하늘의 MyISAM
테이블에 대해 LOAD DATA INFILE
을 사용하면 고유하지 않은 인덱스는 모든 ( REPAIR TABLE
로) 다른 배치에 작성됩니다. 일반적으로 많은 인덱스가있을 때이 방법으로 LOAD DATA INFILE
이 훨씬 빨라집니다. 일부 극단적 인 경우에는 파일을 테이블에로드하기 전에 ALTER TABLE ... DISABLE KEYS
에 인덱스를 비활성화하고 파일을로드 한 후 ALTER TABLE ... ENABLE KEYS
를 사용하여 인덱스를 다시 작성 하여 인덱스를 더욱 빠르게 수행 할 수 있습니다. 섹션 8.2.2.1 "INSERT 문의 속도" 를 참조하십시오.
FIELDS
및 LINES
절의 구문은 LOAD DATA INFILE
및 SELECT ... INTO OUTFILE
의 두 문장에서 동일합니다. 두 어구도 옵션이지만, 모두가 지정되는 경우 FIELDS
을 LINES
전에 지정해야합니다.
FIELDS
절을 지정하는 경우, 각 하위 절 ( TERMINATED BY
, [OPTIONALLY] ENCLOSED BY
및 ESCAPED BY
)도 옵션입니다. 그러나 그 중 적어도 하나를 지정해야합니다.
FIELDS
또는 LINES
절을 지정하지 않으면, 디폴트는 다음을 기술했을 경우와 같습니다.
FIELDS TERMINATED BY '\ t'ENCLOSED BY ''ESCAPED BY '\\' LINES TERMINATED BY '\ n'STARTING BY '
(백 슬래시는 SQL 문을 문자열의 MySQL의 이스케이프 문자이기 때문에 리터럴 백 슬래시를 지정하려면 하나의 백 슬래시로 해석되는 값에 2 개의 backslash를 지정해야합니다 이스케이프 시퀀스 '\t'
와 '\n'
은 각각 탭과 개행 문자를 지정합니다.)
즉, 기본적으로 입력을 읽을 때 LOAD DATA INFILE
은 다음과 같이 작동합니다.
줄 바꿈의 위치에있는 행의 경계를 찾습니다.
어떤 행 프리픽스도 생략하지 않습니다.
탭의 위치에서 행을 필드로 구분합니다.
이 필드를 인용 문자로 둘러싸여있는 것을 기대하지 않습니다.
앞에 이스케이프 문자 "
\
"가 문자를 이스케이프 시퀀스로 해석합니다. 예를 들어, "\t
","\n
"및"\\
"는 각각, 탭, 줄 바꿈 및 백 슬래시를 나타냅니다. 이스케이프 시퀀스의 전체 목록은 뒤의FIELDS ESCAPED BY
의 설명을 참조하십시오.
반대로, 기본적으로 출력을 쓸 때 SELECT ... INTO OUTFILE
는 다음과 같이 작동합니다.
필드 사이에 탭을 씁니다.
필드를 인용 문자로 묶 없습니다.
"
\
"를 사용하여 필드 값 안에 나타나는 탭, 줄 바꿈, 또는"\
"인스턴스를 탈출합니다.행의 마지막에 줄을 출력합니다.
Windows 시스템에서 텍스트 파일을 생성 한 경우 Windows 프로그램은 일반적으로 라인 종결 자로 두 글자를 사용하기 때문에 그 파일을 제대로 읽으려면 LINES TERMINATED BY '\r\n'
의 사용이 필요할 수 있습니다. WordPad 같은 일부 프로그램은 파일을 쓸 때 행 종결 자로 \r
를 사용할 수 있습니다. 이러한 파일을 읽으려면 LINES TERMINATED BY '\r'
을 사용합니다.
읽을 모든 행에 무시하려는 공통의 프리픽스가 포함되어있는 경우 LINES STARTING BY '
를 사용하여 프리픽스와 그 앞에있는 모든 것을 생략 할 수 있습니다. 행에 프리픽스가 포함되지 않은 경우 행 전체가 생략됩니다. 예를 들어, 다음 명령문을 발행합니다. prefix_string
'
LOAD DATA INFILE '/tmp/test.txt'INTO TABLE test FIELDS TERMINATED BY ','LINES STARTING BY 'xxx';
데이터 파일은 다음과 같이되어 있습니다.
xxx "abc"1 something xxx "def"2 "ghi"3
결과 행은 ("abc",1)
및 ("def",2)
입니다. 파일의 세 번째 줄은 프리픽스가 포함되어 있지 않기 때문에 생략됩니다.
IGNORE
옵션을 사용하면 파일의 맨 위에있는 줄을 무시할 수 있습니다. 예를 들어, number
LINESIGNORE 1 LINES
를 사용하면 열 명을 포함한 시작 머리글 행을 건너 뛸 수 있습니다.
LOAD DATA INFILE '/tmp/test.txt'INTO TABLE test IGNORE 1 LINES;
SELECT ... INTO OUTFILE
과 LOAD DATA INFILE
를 함께 사용하여 데이터베이스에서 파일에 데이터를 쓴 후 나중에 그 파일을 원본 데이터베이스에 읽을 경우 두 문 필드 처리 및 행 처리 옵션 일치해야합니다. 그렇지 않으면, LOAD DATA INFILE
은 파일의 내용을 제대로 해석하지 않습니다. SELECT ... INTO OUTFILE
을 사용하여 쉼표로 구분 된 필드가 포함 된 파일을 작성합니다.
SELECT * INTO OUTFILE 'data.txt' FIELDS TERMINATED BY ',' FROM table2;
쉼표로 구분 된 파일을 읽어 되돌리기위한 올바른 문은 다음과 같이됩니다.
LOAD DATA INFILE 'data.txt'INTO TABLE table2 FIELDS TERMINATED BY ',';
대신 다음 문을 사용하여이 파일을 읽으려고해도, 이것은 필드 사이의 탭을 찾도록 LOAD DATA INFILE
에 지시하기 위해 작동하지 않습니다.
LOAD DATA INFILE 'data.txt'INTO TABLE table2 FIELDS TERMINATED BY '\ t';
그 결과 각 입력 행이 하나의 필드로 해석 될 수 있습니다.
LOAD DATA INFILE
을 사용하면 외부 소스에서 가져온 파일을 읽을 수 있습니다. 예를 들어, 많은 프로그램은 각각 쉼표로 구분 된 큰 따옴표로 둘러싸인 여러 필드를 포함해야하며, 시작 행이 컬럼 이름이있는 같은 쉼표로 구분 된 값 (CSV) 형식 로 데이터를 내보낼 수 있습니다. 이러한 파일의 행이 캐리지 리턴과 줄 바꿈 쌍으로 종료하는 경우 다음과 같은 문이 파일을로드하는 데 사용하는 필드 처리 및 행 처리 옵션을 보여줍니다.
LOAD DATA INFILE 'data.txt'INTO TABLE tbl_name
FIELDS TERMINATED BY ','ENCLOSED BY ' "'
LINES TERMINATED BY '\ r \ n'
IGNORE 1 LINES;
입력 값이 반드시 인용되지 않은 경우에는 ENCLOSED BY
키워드 앞에 OPTIONALLY
을 사용합니다.
필드 처리 또는 행 처리의 어떤 옵션도 빈 문자열 ( ''
)을 지정할 수 있습니다. 비어 있지 않은 경우 FIELDS [OPTIONALLY] ENCLOSED BY
및 FIELDS ESCAPED BY
값은 단일 문자 여야합니다. FIELDS TERMINATED BY
, LINES STARTING BY
및 LINES TERMINATED BY
값은 여러 문자가 될 수 있습니다. 예를 들어, 캐리지 리턴과 줄 바꿈 쌍으로 끝나는 줄을 서면 또는 이러한 행을 포함하는 파일을 읽으려면 LINES TERMINATED BY '\r\n'
절을 지정합니다.
%%
로 이루어진 행으로 구분 된 농담을 포함한 파일을 읽으려면 다음과 같이 할 수 있습니다.
CREATE TABLE jokes (a INT NOT NULL AUTO_INCREMENT PRIMARY KEY, joke TEXT NOT NULL); LOAD DATA INFILE '/tmp/jokes.txt'INTO TABLE jokes FIELDS TERMINATED BY ' LINES TERMINATED BY '\ n %% \ n'(joke);
FIELDS [OPTIONALLY] ENCLOSED BY
는 필드의 따옴표를 제어합니다. 출력 ( SELECT ... INTO OUTFILE
)에서 워드 OPTIONALLY
을 생략하면 모든 필드가 ENCLOSED BY
문자로 둘러싸여 있습니다. 필드 구분 기호로 쉼표를 사용하여 이러한 출력의 예를 보여줍니다.
"1", "a string", "100.20" "2", "a string containing a, comma", "102.20" "3", "a string containing a \"quote ","102.20 " "4", "a string containing a \"quote and comma ","102.20 "
OPTIONALLY
을 지정한 경우 ENCLOSED BY
문자는 문자열 데이터 형식 ( CHAR
, BINARY
, TEXT
, ENUM
등)을 가진 컬럼의 값을 묶는 데에만 사용됩니다.
1 "a string", 100.20 2 "a string containing a, comma", 102.20 3 "a string containing a \"quote ", 102.20 4 "a string containing a \"quote and comma ", 102.20
필드 값에 ENCLOSED BY
문자가 나타나 자 그 문자는 전에 ESCAPED BY
문자를 붙여서 이스케이프됩니다. 또한 빈 ESCAPED BY
값을 지정했을 경우는 LOAD DATA INFILE
에서 제대로 읽을 수없는 출력이 잘못 생성 될 가능성도 있습니다. 예를 들어, 이스케이프 문자가 비어 있으면 지금 나타낸 이전 출력은 다음과 같이됩니다. 4 번째 줄의 두 번째 필드에 포함 된 따옴표 뒤에 쉼표가 계속되고있는 것에 주목하십시오. 그러면이 필드가 (잘못) 종료하도록 보입니다.
1 "a string", 100.20 2 "a string containing a, comma", 102.20 3 "a string containing a"quote ", 102.20 4 "a string containing a", quote and comma ", 102.20
입력은 ENCLOSED BY
문자 (존재하는 경우)는 필드 값의 마지막에서 제거됩니다. (이것은 OPTIONALLY
가 지정되어 있는지 여부에 상관하지 않습니다. OPTIONALLY
은 입력의 해석에 영향을주지 않습니다.) ENCLOSED BY
문자가 ESCAPED BY
문자 뒤에 나타난 경우 현재 필드 값의 일부로 해석됩니다.
필드가 ENCLOSED BY
문자로 시작했을 때, 그 문자의 인스턴스가 필드 값의 끝으로 인식되는 것은 그 후에 필드 또는 행의 TERMINATED BY
시퀀스가 계속되고있는 경우만입니다. 모호성을 피하기 위해 필드 값에 ENCLOSED BY
문자가 나타날 때 그것을 두 글자 수, 그것은 그 문자의 단일 인스턴스로 해석됩니다. 예를 들어, ENCLOSED BY '"'
가 지정되어있는 경우 따옴표는 아래와 같이 처리됩니다.
"The" "BIG" "boss"-> The "BIG"boss The "BIG"boss -> The "BIG"boss The ""BIG ""boss -> The ""BIG ""boss
FIELDS ESCAPED BY
는 특수 문자를 읽거나 쓰는 방법을 제어합니다.
입력은
FIELDS ESCAPED BY
문자가 비어 있지 않은 경우, 그 문자가 나타나면 제거되고 다음 문자가 필드 값의 일부로 문자 그대로 해석됩니다. 첫 번째 문자가 이스케이프 문자로 일부 2 문자 순서는 예외입니다. 이러한 시퀀스 (escape 문자에 "\
"를 사용하여) 다음 표에 나와 있습니다.NULL
처리 규칙 내용은이 섹션의 나머지 부분에서 설명되어 있습니다.문자 이스케이프 시퀀스 \ 0
ASCII NUL ( 0x00
) 문자\ b
백 스페이스 문자 \ n
개행 (줄 바꿈) 문자 \ r
구간 \ t
탭 문자. \ Z
ASCII 26 (Ctrl + Z) \ N
NULL "
\
"에서 이스케이프 구문 대한 자세한 내용은 섹션 9.1.1 "문자열 리터럴" 을 참조하십시오.FIELDS ESCAPED BY
문자가 비어있는 경우 이스케이프 시퀀스의 해석은 실행되지 않습니다.출력은
FIELDS ESCAPED BY
문자가 비어 있지 않은 경우, 그 문자는 출력에서 다음 문자 앞에 붙이는 데 사용됩니다.FIELDS ESCAPED BY
문자FIELDS [OPTIONALLY] ENCLOSED BY
문자FIELDS TERMINATED BY
및LINES TERMINATED BY
값의 첫 번째 문자ASCII
0
(이스케이프 문자 다음에 실제로 기록하는 문자는 0의 값의 바이트가 아닌 ASCII의 "0
"입니다)
FIELDS ESCAPED BY
문자가 비어있는 경우 어떤 문자도 이스케이프되지 않고NULL
은\N
대신NULL
로 출력됩니다. 특히 데이터의 필드 값에 지금 지정된 목록에서 하나의 문자가 포함되어 있으면 빈 이스케이프 문자를 지정하는 것은 아마 적절한 방법이 없습니다.
어떤 경우는 필드 처리 및 행 처리 옵션은 상호 작용합니다.
LINES TERMINATED BY
가 빈 문자열이며, 한편FIELDS TERMINATED BY
가 하늘이 아닌 경우, 행은FIELDS TERMINATED BY
라도 종료합니다.FIELDS TERMINATED BY
와FIELDS ENCLOSED BY
의 가치도 빈 (''
) 인 경우는 고정 행 (구분되지 않은) 형식이 사용됩니다. 고정 행 형식은 필드 사이에 구분 기호는 사용되지 않습니다 (다만, 행 터미네이터는 계속 존재할 수 있습니다). 대신 열 값을 해당 필드의 모든 값을 유지하기 위해 충분히 넓은 필드 폭을 사용하여 읽기 및 쓰기가 이루어집니다.TINYINT
,SMALLINT
,MEDIUMINT
,INT
및BIGINT
에서 선언 된 표시 폭에 관계없이 필드 폭은 각각 4,6,8,11 및 20입니다.LINES TERMINATED BY
는 계속 행을 구분하는 데 사용됩니다. 행에 모든 필드가 포함되지 않은 경우, 컬럼의 나머지 부분은 기본값으로 설정됩니다. 행 종료 문자가 존재하지 않는 경우이를''
로 설정하십시오. 이 경우 텍스트 파일의 각 행에 모든 필드가 포함되어 있어야합니다.고정 행 형식은 또한 나중에 설명되는 바와 같이,
NULL
값의 처리에도 영향을줍니다. 멀티 바이트 문자 집합을 사용하는 경우는 고정 크기 포맷이 작동하지 않습니다.
NULL
값 처리는 사용되는 FIELDS
및 LINES
옵션에 따라 다릅니다.
기본
FIELDS
및LINES
값은NULL
출력으로\N
필드 값으로 기록되고\N
필드 값은 입력으로NULL
로 읽습니다 (ESCAPED BY
문자는 '\
'이라고 가정합니다).FIELDS ENCLOSED BY
가 비어 있지 않으면 리터럴 단어NULL
을 값으로 포함하는 필드는NULL
값으로 읽습니다. 이것은 문자열'NULL'
로 읽는,FIELDS ENCLOSED BY
문자로 둘러싸인 단어NULL
과는 다릅니다.FIELDS ESCAPED BY
가 비어있는 경우NULL
워드NULL
로 기록됩니다.고정 행 형식 (이것은
FIELDS TERMINATED BY
와FIELDS ENCLOSED BY
가 모두 비어있을 때 사용됩니다)는NULL
은 빈 문자열로 기록됩니다. 이렇게하면NULL
값과 빈 문자열이 모두 빈 문자열로 기록되기 때문에 파일에 기록 된 경우 테이블에서이 둘을 구별 할 수 없습니다. 파일을 다시 읽어 때이 두 가지를 구별 할 수 필요한 경우 고정 행 형식을 사용해서는 없습니다.
NULL
을 NOT NULL
컬럼에로드하려고하면 그 컬럼의 데이터 유형의 암시 적 기본값 할당이 이루어지고 경고가 발생하거나 엄격한 SQL 모드에서 오류가 발생합니다. 암시 적 기본값은 섹션 11.6 "데이터 유형 기본값" 으로 설명되어 있습니다.
다음의 일부 케이스는 LOAD DATA INFILE
에서 지원되지 않습니다.
고정 크기 행 (
FIELDS TERMINATED BY
와FIELDS ENCLOSED BY
가치도 하늘) 및BLOB
또는TEXT
컬럼.다른 구분 문자와 동일하거나 또는 다른 구분 문자 접두어 인 구분 기호를 지정했을 경우,
LOAD DATA INFILE
은 입력을 올바르게 해석 할 수 없습니다. 예를 들어, 다음의FIELDS
절에서는 문제가 발생합니다.FIELDS TERMINATED BY ' "'ENCLOSED BY '"'
FIELDS ESCAPED BY
가 비어있는 경우 필드 값에FIELDS ENCLOSED BY
또는LINES TERMINATED BY
에 이어FIELDS TERMINATED BY
값이 나타나면LOAD DATA INFILE
은 필드 또는 행의 읽기를 매우 빨리 중지합니다. 이것은LOAD DATA INFILE
이 필드 또는 행의 값이 어디에서 종료를 제대로 확인할 수 없기 때문에 발생합니다.
다음 예제에서는 persondata
테이블의 모든 컬럼을로드합니다.
LOAD DATA INFILE 'persondata.txt'INTO TABLE persondata;
기본적으로 LOAD DATA INFILE
명령문의 마지막에 컬럼 목록이 지정되지 않은 경우에는 입력 행에 테이블 컬럼 당 필드가 포함되어있는 것이 기대됩니다. 테이블의 컬럼의 일부만을로드하려면 컬럼 목록을 지정합니다.
LOAD DATA INFILE 'persondata.txt'INTO TABLE persondata (col1, col2, ...);
컬럼리스트는 또한 입력 파일의 필드 순서가 테이블의 컬럼의 순서와 다른 경우에도 지정해야합니다. 그렇지 않으면, MySQL은 입력 필드와 테이블 컬럼을 일치시키는 방법을 모르겠습니다.
컬럼리스트에는 컬럼 이름 또는 사용자 변수 중 하나를 포함 할 수 있습니다.사용자 변수는 SET
절을 사용하여 각 값에 대해 변환을 수행하고 그 결과를 컬럼에 할당 할 수 있습니다.
SET
절의 사용자 변수는 여러 가지 방법으로 사용할 수 있습니다. 다음 예제에서는 첫 번째 입력 열을 직접 t1.column1
값으로 사용하고 두 번째 입력 열을 t1.column2
값에 사용하기 전에 나눗셈 연산의 대상이되는 사용자 변수에 할당합니다.
LOAD DATA INFILE 'file.txt' INTO TABLE t1 (column1 @ var1) SET column2 = @ var1 / 100;
SET
절을 사용하면 입력 파일에서 검색되지 않는 값을 지정할 수 있습니다. 다음 문은 column3
현재 날짜와 시간을 설정합니다.
LOAD DATA INFILE 'file.txt' INTO TABLE t1 (column1, column2) SET column3 = CURRENT_TIMESTAMP;
입력 값을 사용자 변수에 할당하고 변수를 테이블 컬럼에 할당하지 않도록하여 그 값을 파기 할 수 있습니다.
LOAD DATA INFILE 'file.txt' INTO TABLE t1 (column1, @dummy, column2, @dummy, column3);
컬럼 / 변수 목록과 SET
절의 사용은 다음 제한에 따릅니다.
SET
절 대입은 할당 연산자의 왼쪽에 컬럼 이름 만 두도록하십시오.SET
의 대입 오른쪽에서 서브 쿼리를 사용할 수 있습니다. 컬럼에 할당 된 값을 반환 서브 쿼리로 사용할 수 스칼라 서브 쿼리뿐입니다. 또한 서브 쿼리를 사용하여로드되는 테이블에서 선택 할 수 없습니다.IGNORE
절에 의해 무시 된 행은 열 / 변수 목록이나SET
절은 처리되지 않습니다.사용자 변수는 표시 폭이 없기 때문에 고정 행 형식의 데이터를로드하는 경우 사용자 변수를 사용할 수 없습니다.
입력 행을 처리 할 때 LOAD DATA
는 그것을 필드로 분할하여 열 / 변수 목록과 SET
절에 따라 값 (있는 경우)를 사용합니다. 그 후, 결과 행이 테이블에 삽입됩니다. 그 테이블에 BEFORE INSERT
또는 AFTER INSERT
트리거가 존재하는 경우,이 트리거는 각각 행 삽입 전이나 후에 활성화됩니다.
입력 행에 포함되는 필드가 너무 많은 경우, 여분의 필드는 무시되어 경고 수가 1 증가합니다.
입력 행에 포함 된 필드가 너무 적은 경우 입력 필드가없는 테이블 컬럼을 기본값으로 설정됩니다. 기본값 할당 내용은 섹션 11.6 "데이터 유형 기본값" 으로 설명되어 있습니다.
빈 필드 값은 필드가없는 것으로 간주되지 않고 다음과 같이 해석됩니다.
문자열의 경우,이 컬럼은 빈 문자열로 설정됩니다.
수치 형의 경우,이 컬럼은
0
으로 설정됩니다.날짜 및 시간 형식의 경우이 열은 그 형태에 적절한 " 0 " 의 값으로 설정됩니다. 11.3 절 "날짜 및 시간 형식" 을 참조하십시오.
이들은 INSERT
또는 UPDATE
문에서 빈 문자열을 문자열, 숫자, 날짜 또는 시간의 각 유형에 명시 적으로 할당 한 경우의 결과와 동일합니다.
하늘의 필드 값이나 잘못된 필드 값의 처리는 SQL 모드가 제한적인 값으로 설정되어 있으면, 지금 설명 된 작업은 달라집니다. 예를 들어, sql_mode = 'TRADITIONAL
이면 빈 값이나 'x'
등의 값을 수치 열로 변환하면 0으로 변환되는 것이 아니라 오류가 발생합니다. ( LOCAL
이 지정되어있는 경우 작업 중에 파일 전송을 중지하는 방법이 서버는 없기 때문에 제한적인 sql_mode
값이 설정되어 있어도 오류가 아닌 경고가 발생합니다. )
TIMESTAMP
컬럼이 현재 날짜와 시간으로 설정되는 것은, 그 컬럼에 NULL
값 (즉, \ N
)이 존재하며 그 컬럼이 NULL
값을 허용하도록 선언되어 있지 않은 경우, 또는 TIMESTAMP
컬럼 기본값은 현재 타임 스탬프이며, 한편 필드 목록이 지정된 경우이 컬럼이 필드 목록에서 생략되는 경우뿐입니다.
LOAD DATA INFILE
는 모든 입력을 문자열로 간주하므로 ENUM
또는 SET
컬럼의 값을 INSERT
문처럼 사용 할 수 없습니다. ENUM
및 SET
값은 모두 문자열로 지정해야합니다.
BIT
값을 2 진수 ( b'011010 '
등)을 사용하여로드 할 수 없습니다. 이 문제를 해결하려면 그 값을 일반 정수로 지정하고 SET
절을 사용하여 변환하여 MySQL 숫자 형 변환이 실행되고 그것이 BIT
컬럼에 올바르게로드되도록합니다 .
shell>cat /tmp/bit_test.txt
2 127 shell>mysql test
mysql>LOAD DATA INFILE '/tmp/bit_test.txt'
->INTO TABLE bit_test (@var1) SET b = CAST(@var1 AS UNSIGNED);
Query OK, 2 rows affected (0.00 sec) Records: 2 Deleted: 0 Skipped: 0 Warnings: 0 mysql>SELECT BIN(b+0) FROM bit_test;
+----------+ | bin(b+0) | +----------+ | 10 | | 1111111 | +----------+ 2 rows in set (0.00 sec)
Unix에서는 LOAD DATA
에서 파이프에서 읽을 필요가있는 경우는 다음의 방법을 사용할 수 있습니다 (이 예에서는 /
디렉토리의 목록을 테이블 db1.t1
에로드합니다).
mkfifo /mysql/data/db1/ls.dat chmod 666 /mysql/data/db1/ls.dat find / -ls > /mysql/data/db1/ls.dat & mysql -e "LOAD DATA INFILE 'ls.dat' INTO TABLE t1" db1
로드되는 데이터를 생성하는 명령과 mysql 명령을 다른 단말기에서 실행하거나 (앞의 예에 나타낸 것처럼) 백그라운드에서 데이터 생성 프로세스를 실행해야합니다. 그렇지 않으면 데이터가 mysql 프로세스에서 읽을 준비가 될 때까지 파이프가 차단됩니다.
LOAD DATA INFILE
문을 완료하면 다음 형식의 정보 문자열을 반환합니다.
Records : 1 Deleted : 0 Skipped : 0 Warnings : 0
경고는 INSERT
문을 사용하여 값을 삽입 할 때와 같은 상황에서 발생합니다 ( 섹션 13.2.5 "INSERT 구문" 을 참조하십시오). 그러나 LOAD DATA INFILE
는 입력 행의 필드가 너무 적거나 너무 많은 경우에도 경고가 생성됩니다.
SHOW WARNINGS
을 사용하면 발생한 문제에 관한 정보로서 첫 max_error_count
경고 목록을 얻을 수 있습니다. 섹션 13.7.5.41 "SHOW WARNINGS 구문" 을 참조하십시오.
C API를 사용하는 경우, mysql_info ()
함수를 호출하여 명령문에 대한 정보를 얻을 수 있습니다. 섹션 23.8.7.35 "mysql_info ()" 를 참조하십시오.