2012-12-27 2 views
3

나는 내 DB에 내가 기본 키로 내 ID를 설정하는 것이 매우 이상한 문제에 직면하고 동일한 예입니다 너무 그 ID가 저장되지 않습니다 : 다음을 삭제하면IDS 시각적으로 동일하지만, 실제로

 
+--------+ 
| ID | 
+--------+ 
| ABC94 | 
| ABC94 | 
+--------+ 

을 phpmyadmin에서 삭제 된 다음 쿼리를 생성합니다. 하나의 ID에 \r이 포함되어있어 고유 한 것으로 보이지만 선택보기에는 표시되지 않습니다. 친절하게도 ID가 저장 될 때 어떻게하면 ABC94 부분 만 받아 들여야하고 \r or \d or the like과 같은 부분은 무시해야 하는지를 알려주십시오. 감사합니다,

DELETE FROM `Db` WHERE `ID` = 'ABC94\r'; 
DELETE FROM `DB` WHERE `ID` = 'ABC94'; 

나는 다음 코드를 시도했지만 잘 작동 원인 난 여분의 공백의 가능성이있는 경우 대신 \

SELECT SUBSTRING_INDEX("ABC94\r", "\", 1) 
+0

어떻게 레코드를 삽입 했습니까? –

+0

@JW. DB에 csv 파일을 덤프하지만 이동하는 동안 무시 부분을 적용 할 수 있도록 데이터를 다른 테이블로 덤프 한 후에 이동했습니다. –

답변

2

-를 사용할 때 내가 생각 때문에 \ 나에게 오류를 준 , 응용 프로그램 코드 에서 삽입 이전에 처리하거나 INSERT 시간에 RDBMS로 잘라내야합니다.

INSERT INTO `Db` (`ID`) VALUES (TRIM('input value')) 

다른 인쇄 가능한 문자로 보조를 대체하는 계획을 고안하지 않는 한 키 위반없이 기존 행을 업데이트 할 수 없습니다.

예를 들어, x와 캐리지 리턴 문자를 대체하고, 그들은 여전히 ​​고유합니다

/* Global replacement of carriage returns with 'x' */ 
UPDATE `Db` SET `ID` = REPLACE(`ID`, '\r', 'x') 

http://dev.mysql.com/doc/refman/5.0/en/string-functions.html#function_trim

SUBSTRING_INDEX()와 귀하의 시도가 거의 유효하지만,이 백 슬래시를 생략해야

및 빈 문자열 ''을 대신 제공했습니다.

SELECT SUBSTRING_INDEX('ABC94\r', '', 1) 

하지만 위 가지고 TRIM()를 사용하여 더 신뢰할 수있다. 가능한 한 최선의 방법은 입력 데이터의 출처를 수정하여 처음부터 생성하지 않도록하는 것입니다.

+0

알았어. 친절하게도 왜'UPDATE 테이블 SET id = TRIM ("id/r") WHERE id = "Fall97 \ r"'괜찮습니다. 그러나 작동하지 않습니다. UPDATE 테이블 SET ID = TRIM (id) WHERE id = "Fall97 \ r" ' –

+0

WHERE 절을 제공하지 마십시오. 모든 행에 대해 업데이트를 실행하면 각 행이 트리밍되지만 키 위반이 발생하기 때문에이를 수행 할 수 없습니다. 첫 번째 예에서는 따옴표로 묶인 리터럴 문자열 "id/r"로 업데이트하고 있습니다. –

+0

아니, 내 DB에서 ID를 제거,'FALL97 \ r' 테이블에 하나의 ID입니다하지만 난 간단한 문자열을주는 경우 어떤 db 열을 부여하여 업데이트 할 수 없습니다 트릭 작동 –