2009-10-23 7 views
1

누군가가 나에게 mysql 테이블의 크기가 제한된 열에 이스케이프 된 문자열을 저장하는 방법을 설명 할 수 있습니까? 내 말은, 만약 내가 "abcdefghij"를 삽입하면 한계에 도달했지만, "abcde'ghij"를 삽입하면 크기가 정의 된 열 (varchar (10)이라고 가정 해 봅시다)을 의미합니다. 나는 이스케이프 된 이후 한도를 초과합니다. 이 마지막 문자열의 결과는 원래 크기가 10이지만 "abcde \ 'ghij"입니다! 이것을 제어하는 ​​방법?mysql 이스케이프 된 문자열 저장소

+5

이중 탈출이 의심됩니다. 나는이 문제를 한번도 갖지 못했다. –

답변

0

당신이 중 하나는 (모든 문자가 탈출해야하는 가능성이 있다고 가정) 값을 두 번 공간을 할당하거나 저장할 때, 그것을 방출하지 않을 경우 텍스트를 탈출하여 문제를 치마해야합니다.

(두 번째 것은 읽는 것보다 더 자주 글을 쓸 때 단점이 있지만, 표시되는 방법이나 위치에 따라 다르게 탈출해야한다는 이점이 있습니다).

갱신 : 나는 MySQL은 삽입에 사용되는 추가 문자를 저장하지 않습니다 것을 알고 있지만 삽입 할 때 그것은 또한 이스케이프 된 작은 따옴표를 위해 \'를 사용하지 않는 - 그래서 나는 단지 이스케이프가 있다고 가정 할 수 있습니다 어떤 저장하는 값을 소비하거나 사용하고 있습니다. (예를 들어 값이 HTML에서 사용되고 있기 때문에 사람 저장소 ' 또는 "을 보았습니다 ... HTML이 아닌 목적으로 사용되는 데이터의 가능성이있는 경우 노출을 취하고 인코딩하는 것이 좋습니다.)

+3

올바르게 사용하면 이스케이프 문자가 데이터베이스에 저장되지 않습니다. mysql에 데이터를 전달할 때만 사용된다. –

1

ANSI SQL 이스케이프 문자는 '이지만 NO_BACKSLASH_ESCAPES이 활성화되지 않은 경우 MySQL도 \을 이스케이프 처리 할 수 ​​있습니다.

char를 이스케이프 처리해도 실제로 char가 하나 더 사용되지 않습니다. 파서가 입력을 올바르게 읽는 것만 가능합니다.

예를 들어, '1234567890'또는 '12345678''0'을 삽입하면 둘 다 같은 양의 공간을 차지하며 바운드 필드가 오버플로되지 않습니다.

MySQL manual에는 이에 대한 완벽한 장이 있습니다.

1

저장된 값에는 백 슬래시가 포함되면 안됩니다. 당신은 어떻게 든 당신의 데이터를 두 번 이스케이프하고있다. 프로세스가 같이하는 방법의

매우 단순한 의사는 :

data = "Let's party!" 
data = escape(data) # Let\'s party 
save(data) 
## The database ignores the single quote, since it is escaped with a backslash 
## but then removes the slash before storing data 

read(data) # Let's party 
0

저장 데이터를 배치하고, 준비된 쿼리를 사용하지 않는, 당신은 위의 표시로 정확히 한 번만 데이터를 탈출해야합니다.

쿼리의 문자열 리터럴 부분에 준비된 쿼리를 사용하는 경우 데이터를 이스케이프하면 안되므로 문제가 발생합니다.

$db = new mysqli('localhost', 'my_user', 'my_password', 'world'); 
$sql = 'INSERT INTO `blah` (field1,field2) VALUES (?,?)'; 
$query = $db->prepare($sql); 
$query->bind_parms('ss',$no_escaping,$needed_here); 
$query->execute(); 

편집 : 준비된 쿼리를 사용하고 있습니까?

당신이 있다면, 나는이 here.에 대한 수업을 함께 자수했습니다.

3

문자열 이스케이프와 이스케이프 문자의 작동 방식은 종종 혼란 스럽습니다.

$string = "My \"string\" is cool."; 

변수 $string어떤 슬래시 포함되어 있지 않습니다 예를 들어,이 PHP 코드를 부여.필자가 작성한 코드에는 슬래시가 있지만 파서의 도움을 위해서만 존재하며 다음 따옴표로 문자열을 끝내면 안된다.

데이터베이스에 대해서도 동일하게 적용되지만, 많은 사람들이 방문하는 곳입니다. 왜냐하면 2 파서, 첫째로 프로그래밍 언어 (예 : PHP)가 읽은 문자열을 작성한 다음 데이터베이스가 문자열을 작성하기 때문입니다. PHP는이를 읽고이 될 문자열을 해석

$sql = "INSERT INTO myTable VALUES (\"\\\"\\\"\")"; 

예를 들어, 데이터베이스에 "" (이 인용 부호가 아닌 빈 문자열) 문자열을 삽입하는, 당신은이처럼 보였다 일부 코드를 필요 했어 :

INSERT INTO myTable VALUES ("\"\"") 

그리고 MySQL은 그것을 읽고으로 삽입 값을 해석 :

"" 

(두 따옴표)

이 모든 것이 정렬되었으므로 현재 문제는 무엇입니까? 탈출 한 끈이 있다고하던가요? 그게 문제 야. 마지막 순간에 꼭 필요한대로 문자열 만 이스케이프해야합니다. 저장하려는 데이터가 5 o'clock 경우, 다음 문자열 값은 당신이 그것을 탈출해야 할 때 5 o'clock, 하지5 o\'clock

당신은 SQL 문에 그 값을 삽입하는 그 순간의해야합니다.

$myString = '5 o\'clock'; // value is: 5 o'clock 
$sql = sprintf(
    "INSERT INTO myTable VALUES ('%s')", 
    mysql_real_escape_string($myString) // 5 o\'clock 
); 
echo $sql; // INSERT INTO myTable VALUES ('5 o\'clock'); 
관련 문제