MySQL에서 작은 따옴표를 이스케이프하는 방법


98

작은 따옴표 또는 큰 따옴표로 구성된 MySQL에 값을 어떻게 삽입합니까? 즉

This is Ashok's Pen.

작은 따옴표는 문제를 일으킬 것입니다. 다른 이스케이프 문자가있을 수 있습니다.

데이터를 올바르게 삽입하는 방법은 무엇입니까?


답변:


126

간단히 말해서 :

SELECT 'This is Ashok''s Pen.';

따라서 문자열 내에서 각 작은 따옴표를 두 개로 바꿉니다.

또는:

SELECT 'This is Ashok\'s Pen.'

탈출 =)


9
가능한 솔루션으로 mysql_real_escape_string () 또는 addslashes ()를 포함하도록 게시물을 업데이트하고 싶을 수 있습니다 ... 아래 주석 중 하나 에서처럼 OP는 파일에서 읽고 삽입 중이라고 말합니다.
James B

3
mysql_ * 메서드는 더 이상 사용되지 않으므로 향후 사용을 권장하지 않습니다 .
hd1 2013 년

최선의 선택이 중 하나를 사용하는 요즘 있지만, 그 정답은,
라이언

10

'는 이스케이프 문자입니다. 따라서 문자열은 다음과 같아야합니다.

이것은 Ashok의 펜입니다

일부 프런트 엔드 코드를 사용하는 경우 데이터를 저장 프로 시저로 보내기 전에 문자열 바꾸기를 수행해야합니다.

예를 들어 C #에서는 다음을 수행 할 수 있습니다.

value = value.Replace("'", "''");

그런 다음 값을 저장 프로 시저에 전달합니다.


수동으로 데이터를 삽입하지 않고 파일에서 추출하면 Ashok의 펜이라는 vaklues가 있습니다. 삽입 방법. 이것을하기위한 절차를 만들었습니다 .. 그것을 수정하는 방법.
Ashok Gupta

FWIW minor nit : 백 슬래시 는 "이스케이프 문자"입니다. ''(작은 따옴표 두 개)는 작은 따옴표 문자를 "이스케이프"하는 데 허용되는 특수 대안입니다.
ToolmakerSteve

9

"MySQL에서 문자를 이스케이프하는 방법"에 대한 내 대답을 참조하십시오.

MySQL과 통신하는 데 사용하는 라이브러리에는 이스케이프 기능이 내장되어 있습니다. 예를 들어 PHP에서는 mysqli_real_escape_string 또는 PDO :: quote를 사용할 수 있습니다.


1
수동으로 데이터를 삽입하지 않고 파일에서 추출하면 Ashok의 펜이라는 값이 있습니다. 삽입 방법. 이 작업을 수행하는 절차를 만들었습니다. 수정하는 방법.
Ashok Gupta

메모, This extension was deprecated in PHP 5.5.0, and it was removed in PHP 7.0.0. Instead, the MySQLi or PDO_MySQL extension should be used..
NewBee

7

준비된 문을 사용하면 드라이버가 모든 이스케이프를 처리합니다. 예 (Java) :

Connection conn = DriverManager.getConnection(driverUrl);
conn.setAutoCommit(false);
PreparedStatement prepped = conn.prepareStatement("INSERT INTO tbl(fileinfo) VALUES(?)");
String line = null;
while ((line = br.readLine()) != null) {
    prepped.setString(1, line);
    prepped.executeQuery();
}
conn.commit();
conn.close();

7

이 코드를 사용하십시오.

<?php
    $var = "This is Ashok's Pen.";

    mysql_real_escape_string($var);
?>

이것은 데이터베이스가 문자열의 특수 문자를 감지 할 수 없기 때문에 문제를 해결할 것입니다.


1
메모, This extension was deprecated in PHP 5.5.0, and it was removed in PHP 7.0.0. Instead, the MySQLi or PDO_MySQL extension should be used..
NewBee

6

당신의 관점에 따라 더 안전 할 수도 있고 아닐 수도있는 또 다른 방법이 있습니다. 특정 문자열 함수를 사용하기 때문에 MySQL 5.6 이상이 필요합니다 : FROM_BASE64.

삽입하려는 메시지가 있다고 가정 해 보겠습니다.

"아,"거의 머리가없는 닉은 우아한 손을 흔들었다. "중요하지 않은 문제.... 내가 정말로 합류하고 싶었던 것 같지 않다.... 지원할 것이라고 생각했지만, 요구 사항을 충족하지 못한 것 같다. '- "

그 따옴표에는 작은 따옴표와 큰 따옴표가 많이 있으며 MySQL에 삽입하는 것은 정말 고통 스러울 것입니다. 프로그램에서 삽입하는 경우 따옴표 등을 이스케이프하기 쉽습니다.하지만 SQL 스크립트에 입력해야하는 경우 오류가 발생할 수있는 텍스트를 편집해야합니다 (따옴표를 이스케이프 처리). 또는 줄 바꿈 등에 민감합니다.

대신 텍스트를 Base64로 인코딩 할 수 있으므로 "깨끗한"문자열이됩니다.

SWtGb0xDSWdUbVZoY214NUlFaGxZV1JzWlhOeklFNXBZMnNnZD JGMlpXUWdZVzRnWld4bFoyRnVkQ0JvWVc1a0xDQWlZU0J0WVhS MFpYCklnYjJZZ2JtOGdhVzF3YjNKMFlXNWpaUzRnTGlBdUlDNG dTWFFuY3lCdWIzUWdZWE1nZEdodmRXZG9JRWtnY21WaGJHeDVJ SGRoYm5SbApaQ0IwYnlCcWIybHVMaUF1SUM0Z0xpQlVhRzkxWj JoMElFa25aQ0JoY0hCc2VTd2dZblYwSUdGd2NHRnlaVzUwYkhr Z1NTQW5aRzl1SjMKUWdablZzWm1sc2JDQnlaWEYxYVhKbGJXVn VkSE1uSUMwaUlBPT0K

Base64 인코딩에 대한 몇 가지 참고 사항 :

  1. Base64 인코딩은 바이너리 인코딩 이므로 MySQL이 Base64로 인코딩 된 문자열을 바이트로 디코딩 한 다음 해석 할 것이기 때문에 인코딩을 수행 할 때 올바른 문자 집합을 가져 오는지 확인하는 것이 좋습니다. 확실히하다base64 및 MySQL은 문자 인코딩이 무엇인지에 동의합니다 (I는 UTF-8을 권장합니다).
  2. Stack Overflow에서 가독성을 위해 문자열을 50 개 열로 래핑했습니다. 원하는 수의 열로 래핑 할 수 있으며 (또는 전혀 래핑하지 않음) 여전히 작동합니다.

이제 이것을 MySQL로로드하려면 :

INSERT INTO my_table (text) VALUES (FROM_BASE64(' SWtGb0xDSWdUbVZoY214NUlFaGxZV1JzWlhOeklFNXBZMnNnZD JGMlpXUWdZVzRnWld4bFoyRnVkQ0JvWVc1a0xDQWlZU0J0WVhS MFpYCklnYjJZZ2JtOGdhVzF3YjNKMFlXNWpaUzRnTGlBdUlDNG dTWFFuY3lCdWIzUWdZWE1nZEdodmRXZG9JRWtnY21WaGJHeDVJ SGRoYm5SbApaQ0IwYnlCcWIybHVMaUF1SUM0Z0xpQlVhRzkxWj JoMElFa25aQ0JoY0hCc2VTd2dZblYwSUdGd2NHRnlaVzUwYkhr Z1NTQW5aRzl1SjMKUWdablZzWm1sc2JDQnlaWEYxYVhKbGJXVn VkSE1uSUMwaUlBPT0K '));

이것은 불만없이 삽입되며 문자열 내부의 텍스트를 수동으로 이스케이프 할 필요가 없습니다.


5

문자를 사용하여 특수 문자를 이스케이프해야 \합니다.

This is Ashok's Pen.

된다 :

This is Ashok\'s Pen.

3

데이터베이스에 아포스트로피 ( ')를 유지하려면 아래 코드를 사용하십시오.

$new_value = str_replace("'","\'", $value); 

$ new_value는 데이터베이스에 저장할 수 있습니다.


3

이 코드를 사용할 수 있습니다.

<?php
     $var = "This is Ashok's Pen.";
     addslashes($var);
?>

mysqli_real_escape_string ()이 작동하지 않는 경우.


3

PHP에서는 mysqli_real_escape_string을 사용합니다. 합니다.

PHP 매뉴얼의 예 :

<?php
$link = mysqli_connect("localhost", "my_user", "my_password", "world");

/* check connection */
if (mysqli_connect_errno()) {
    printf("Connect failed: %s\n", mysqli_connect_error());
    exit();
}

mysqli_query($link, "CREATE TEMPORARY TABLE myCity LIKE City");

$city = "'s Hertogenbosch";

/* this query will fail, cause we didn't escape $city */
if (!mysqli_query($link, "INSERT into myCity (Name) VALUES ('$city')")) {
    printf("Error: %s\n", mysqli_sqlstate($link));
}

$city = mysqli_real_escape_string($link, $city);

/* this query with escaped $city will work */
if (mysqli_query($link, "INSERT into myCity (Name) VALUES ('$city')")) {
    printf("%d Row inserted.\n", mysqli_affected_rows($link));
}

mysqli_close($link);
?>



0

프로그래밍 방식 액세스의 경우 자리 표시자를 사용 하여 안전하지 않은 문자를 자동으로 이스케이프 할 수 있습니다.

예를 들어 Perl DBI에서는 다음을 사용할 수 있습니다.

my $string = "This is Ashok's pen";
$dbh->do("insert into my_table(my_string) values(?)",undef,($string)); 

0

addlahes () 또는 mysql_real_escape_string ()을 사용하십시오.


메모, This, mysql_real_escape_string() extension was deprecated in PHP 5.5.0, and it was removed in PHP 7.0.0. Instead, the MySQLi or PDO_MySQL extension should be used..
NewBee

아, 그래, 필요는 내가 지금 mysqli_real_escape_string 추가 php.net/manual/en/mysqli.real-escape-string.php
안토니

답변을 업데이트하는 것이 좋습니다 (예 : 댓글은 언제든지 사라질 수 있음).
Peter Mortensen

0

Delphi를 사용하는 방식 :

"이스케이프"할 TheString :

TheString=" bla bla bla 'em some more apo:S 'em and so on ";

해결책:

StringReplace(TheString, #39,'\'+#39, [rfReplaceAll, rfIgnoreCase]);

결과:

TheString=" bla bla bla \'em some more apo:S \'em and so on ";

이 함수는 모든 Char (39)를 "\ '"로 대체하여 문제없이 MySQL에서 텍스트 필드를 삽입하거나 업데이트 할 수 있습니다.

비슷한 기능이 모든 프로그래밍 언어에서 발견됩니다!


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.