2009-08-21 5 views
1

저는 sqlite3 데이터베이스를 mysql로 ​​변환하고 있습니다.데이터베이스 삽입 문에서 따옴표를 바꾸는 Regexp

나는 AUTOINCREMEMT와 필요한 다른 것들을 변경하는 sed 용 좋은 명령 파일을 가지고있다. 그러나 나는 마지막 것에 붙어있다 : 큰 따옴표.

sqlite3를 덤프 형식 : 첫 번째 문에 대한

CREATE TABLE "products" (
    "id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, 
    "name" varchar(255), 
    "desc" varchar(255)); 

INSERT INTO "products" VALUES(1,'Flux Capacitor', 
    'This is the "real" thing.\nPromise!') 

, 나는 행복 할 것이다 역 따옴표와 MySQL과 모든 따옴표를 대체 할 수 있습니다.

그러나 내 제품 정보에는 데이터에 큰 따옴표가 있습니다. 어떻게 이들을 대체 할 수 없게 할 수 있습니까? 이중 따옴표 만 자리 표시 자로 바꾸려고했는데 다른 큰 따옴표를 모두 바꿀 수 있었지만 자리 표시자를 다시 바꿀 수는 있었지만 정규식은 동등하지 않습니다. 내가 가진으로

이것은까지였다

/"[^"]*"/s 

는 ... 이중 인용 텍스트에 맞게,하지만 난 작은 따옴표 내부에만 따옴표가 일치해야한다는 자격을하는 방법을 알아낼 수 없었다.

+0

당신이 중 하나를 가지고 있지 않은, 또는 다음과 같은 경우 처리 할 수 ​​있는지 확인 : 다음 * 탈출 따옴표가 다른 문자로 작은 따옴표를 모두 교체하는 것이 더 쉬울 수 있습니다 라인 끝 에 걸쳐 * 단일 인용 문자열을, 그들을 다시 변환하십시오. 몇 개의 인스턴스가 있습니까? 가져 오기를 시도하여 오류를 무시한 경우 끝에 오류를 집계 할 수 있습니다. – TheJacobTaylor

답변

3

식별자 구분 기호로 큰 따옴표를 허용하도록 MySQL을 변경했습니다. 이 표준 SQL의 행동, 당신은 MySQL을가 SQL 모드를 그런 식으로 행동 할 수있다 : 더 구체적으로

mysql> SET SQL_MODE = ANSI; 

또는 :

mysql> SET SQL_MODE = ANSI_QUOTES; 

그런 다음 MySQL이 데이터 덤프를 이해해야합니다.

자세한 내용은 "Server SQL Modes"을 참조하십시오.

+0

글쎄, 나는 SET 명령이 존재하지 않았다. 그걸 확인해 볼게. – wesgarrison

0

가 잘 나는 쉽게 preg_replace_callback()와 PHP에서 그것을 해결하는 방법을 알고 :


<?php 

    $sql = file_get_contents('sqlite3 dump.txt'); 
    function callback($match) { return str_replace('"', '`', $match[0]); } 
    $sql = preg_replace_callback('/CREATE TABLE .*?;/s', callback, $sql); 
    echo preg_replace_callback('/INSERT INTO .*? VALUES/s', callback, $sql); 

?>

는 "SQL_MODE = ANSI_QUOTES 설정"할 수없는 한 빌 Karwin 말했다한다.

0

모든 큰 따옴표를 백틱으로 바꿀 수 있으며 mysql이 만족할 것입니다.

지금은 행복하지만 전체적인 문제는 해결되지 않았으므로 앞으로 쉽게 넘어 질 수 있습니다. 아포스트로피와 백 슬래시도 MySQL에서 다르게 작동합니다.

내 제품 정보에 큰 따옴표가 있습니다. 어떻게 이들을 대체 할 수 없게 할 수 있습니까?

신뢰할 수 없습니다. SQL 문법은 실제로 매우 복잡하며 정규 표현식 해킹으로 구문 분석 될 수 없습니다.

기존 구문에 맞게 SQL_MODE를 변경하는 Bill의 제안이 훨씬 더 나은 방법입니다. 나는 특정 데이터베이스의 약점에 내 애플 리케이션을 맞추는 것을 싫어하기 때문에 항상 ANSI 모드로 MySQL을 돌린다.