작은 따옴표 또는 큰 따옴표로 구성된 MySQL에 값을 어떻게 삽입합니까? 즉
This is Ashok's Pen.
작은 따옴표는 문제를 일으킬 것입니다. 다른 이스케이프 문자가있을 수 있습니다.
데이터를 올바르게 삽입하는 방법은 무엇입니까?
답변
간단히 말해서 :
SELECT 'This is Ashok''s Pen.';
따라서 문자열 내에서 각 작은 따옴표를 두 개로 바꿉니다.
또는:
SELECT 'This is Ashok\'s Pen.'
탈출 =)
답변
‘는 이스케이프 문자입니다. 따라서 문자열은 다음과 같아야합니다.
이것은 Ashok의 펜입니다
일부 프런트 엔드 코드를 사용하는 경우 데이터를 저장 프로 시저로 보내기 전에 문자열 바꾸기를 수행해야합니다.
예를 들어 C #에서는 다음을 수행 할 수 있습니다.
value = value.Replace("'", "''");
그런 다음 값을 저장 프로 시저에 전달합니다.
답변
“MySQL에서 문자를 이스케이프하는 방법”에 대한 내 대답을 참조하십시오.
MySQL과 통신하는 데 사용하는 라이브러리에는 이스케이프 기능이 내장되어 있습니다. 예를 들어 PHP에서는 mysqli_real_escape_string 또는 PDO :: quote를 사용할 수 있습니다.
답변
준비된 문을 사용하면 드라이버가 모든 이스케이프를 처리합니다. 예 (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();
답변
이 코드를 사용하십시오.
<?php
$var = "This is Ashok's Pen.";
mysql_real_escape_string($var);
?>
이것은 데이터베이스가 문자열의 특수 문자를 감지 할 수 없기 때문에 문제를 해결할 것입니다.
답변
당신의 관점에 따라 더 안전 할 수도 있고 아닐 수도있는 또 다른 방법이 있습니다. 특정 문자열 함수를 사용하기 때문에 MySQL 5.6 이상이 필요합니다 : FROM_BASE64
.
삽입하려는 메시지가 있다고 가정 해 보겠습니다.
“아,”거의 머리가없는 닉은 우아한 손을 흔들었다. “중요하지 않은 문제…. 내가 정말로 합류하고 싶었던 것 같지 않다…. 지원할 것이라고 생각했지만, 요구 사항을 충족하지 못한 것 같다. ‘- ”
그 따옴표에는 작은 따옴표와 큰 따옴표가 많이 있으며 MySQL에 삽입하는 것은 정말 고통 스러울 것입니다. 프로그램에서 삽입하는 경우 따옴표 등을 이스케이프하기 쉽습니다.하지만 SQL 스크립트에 입력해야하는 경우 오류가 발생할 수있는 텍스트를 편집해야합니다 (따옴표를 이스케이프 처리). 또는 줄 바꿈 등에 민감합니다.
대신 텍스트를 Base64로 인코딩 할 수 있으므로 “깨끗한”문자열이됩니다.
SWtGb0xDSWdUbVZoY214NUlFaGxZV1JzWlhOeklFNXBZMnNnZD
JGMlpXUWdZVzRnWld4bFoyRnVkQ0JvWVc1a0xDQWlZU0J0WVhS
MFpYCklnYjJZZ2JtOGdhVzF3YjNKMFlXNWpaUzRnTGlBdUlDNG
dTWFFuY3lCdWIzUWdZWE1nZEdodmRXZG9JRWtnY21WaGJHeDVJ
SGRoYm5SbApaQ0IwYnlCcWIybHVMaUF1SUM0Z0xpQlVhRzkxWj
JoMElFa25aQ0JoY0hCc2VTd2dZblYwSUdGd2NHRnlaVzUwYkhr
Z1NTQW5aRzl1SjMKUWdablZzWm1sc2JDQnlaWEYxYVhKbGJXVn
VkSE1uSUMwaUlBPT0K
Base64 인코딩에 대한 몇 가지 참고 사항 :
- Base64 인코딩은 바이너리 인코딩 이므로 MySQL이 Base64로 인코딩 된 문자열을 바이트로 디코딩 한 다음 해석 할 것이기 때문에 인코딩을 수행 할 때 올바른 문자 집합을 가져 오는지 확인하는 것이 좋습니다. 확실히하다
base64
및 MySQL은 문자 인코딩이 무엇인지에 동의합니다 (I는 UTF-8을 권장합니다). - Stack Overflow에서 가독성을 위해 문자열을 50 개 열로 래핑했습니다. 원하는 수의 열로 래핑 할 수 있으며 (또는 전혀 래핑하지 않음) 여전히 작동합니다.
이제 이것을 MySQL로로드하려면 :
INSERT INTO my_table (text) VALUES (FROM_BASE64('
SWtGb0xDSWdUbVZoY214NUlFaGxZV1JzWlhOeklFNXBZMnNnZD
JGMlpXUWdZVzRnWld4bFoyRnVkQ0JvWVc1a0xDQWlZU0J0WVhS
MFpYCklnYjJZZ2JtOGdhVzF3YjNKMFlXNWpaUzRnTGlBdUlDNG
dTWFFuY3lCdWIzUWdZWE1nZEdodmRXZG9JRWtnY21WaGJHeDVJ
SGRoYm5SbApaQ0IwYnlCcWIybHVMaUF1SUM0Z0xpQlVhRzkxWj
JoMElFa25aQ0JoY0hCc2VTd2dZblYwSUdGd2NHRnlaVzUwYkhr
Z1NTQW5aRzl1SjMKUWdablZzWm1sc2JDQnlaWEYxYVhKbGJXVn
VkSE1uSUMwaUlBPT0K
'));
이것은 불만없이 삽입되며 문자열 내부의 텍스트를 수동으로 이스케이프 할 필요가 없습니다.
답변
문자를 사용하여 특수 문자를 이스케이프해야 \
합니다.
This is Ashok's Pen.
된다 :
This is Ashok\'s Pen.
