MySQL에서 작은 따옴표를 이스케이프하는 방법
MySQL에 단일 따옴표 또는 이중 따옴표로 구성된 값을 삽입하려면 어떻게 해야 합니까?예
This is Ashok's Pen.
작은 따옴표로 인해 문제가 발생합니다.다른 탈옥 캐릭터가 있을 수 있어요.
데이터를 올바르게 삽입하려면 어떻게 해야 합니까?
간단히 말하면:
SELECT 'This is Ashok''s Pen.';
따라서 문자열 내에서 각 단일 따옴표를 두 개의 따옴표로 바꿉니다.
또는 다음 중 하나를 선택합니다.
SELECT 'This is Ashok\'s Pen.'
탈출 =)
'는 이스케이프 문자입니다.따라서 문자열은 다음과 같습니다.
이것은 아쇼크의 펜입니다.
일부 프런트 엔드 코드를 사용하는 경우 데이터를 저장 프로시저로 전송하기 전에 문자열 치환을 수행해야 합니다.
예를 들어 C#에서는 다음과 같이 할 수 있습니다.
value = value.Replace("'", "''");
저장 프로시저에 값을 전달합니다.
"MySQL에서 문자를 이스케이프하는 방법"에 대한 답변 보기
MySQL과 통신하기 위해 사용하는 라이브러리는 모두 이스케이프 함수가 내장되어 있습니다.예를 들어 PHP에서는 mysqli_real_escape_string 또는 PDO::quote를 사용할 수 있습니다.
다음 코드 사용:
<?php
$var = "This is Ashok's Pen.";
mysql_real_escape_string($var);
?>
그러면 데이터베이스가 문자열의 특수 문자를 탐지할 수 없기 때문에 문제가 해결됩니다.
준비된 문구를 사용하면 운전자가 탈출을 처리합니다.예: (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();
사용자의 관점에 따라 더 안전할 수도 있고 그렇지 않을 수도 있습니다.특정 문자열 함수를 사용하기 때문에 MySQL 5.6 이후가 필요합니다.
다음과 같은 메시지를 삽입할 수 있습니다.
"아, 머리가 거의 없는 닉은 우아한 손을 흔들며, "중요한 일이 아닙니다." "참가하고 싶지는 않지만... 지원하려고 했는데, 분명히 '요건을 채우지 못했습니다.'
이 견적에는 단일 및 이중 따옴표가 많이 포함되어 있어 MySQL에 삽입하는 것은 매우 번거로운 일입니다.프로그램에서 삽입하면 인용문 등이 빠지기 쉽습니다.그러나 SQL 스크립트에 입력해야 하는 경우 텍스트를 편집해야 합니다(따옴표에서 벗어나기 위해). 이 경우 오류가 발생하기 쉽거나 워드 랩핑 등이 발생할 수 있습니다.
대신 텍스트를 Base64로 인코딩할 수 있으므로 "clean" 문자열이 생성됩니다.
SWtGb0xDSWdUbVZoY214NUlFaGxZV1JzWlhOeklFNXBZMnNnZD JGMlpXUWdZVzRnWld4bFoyRnVkQ0JvWVc1a0xDQWlZU0J0WVhS MFpYCklnYjJZZ2JtOGdhVzF3YjNKMFlXNWpaUzRnTGlBdUlDNG dTWFFuY3lCdWIzUWdZWE1nZEdodmRXZG9JRWtnY21WaGJHeDVJ SGRoYm5SbApaQ0IwYnlCcWIybHVMaUF1SUM0Z0xpQlVhRzkxWj JoMElFa25aQ0JoY0hCc2VTd2dZblYwSUdGd2NHRnlaVzUwYkhr Z1NTQW5aRzl1SjMKUWdablZzWm1sc2JDQnlaWEYxYVhKbGJXVn VkSE1uSUMwaUlBPT0K
Base64 인코딩에 대한 주의사항:
- Base64-encoding은 바이너리 인코딩이므로 인코딩을 할 때 문자 세트를 올바르게 해야 합니다.MySQL은 Base64로 인코딩된 문자열을 바이트로 디코딩한 후 해석하기 때문입니다.명심하라.
base64
대해 합니다(UTF-8을합니다).MySQL은 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.
데이터베이스에 아포스트로피를 보관하려면 다음 코드를 사용합니다.
$new_value = str_replace("'","\'", $value);
$new_value
는 데이터베이스에 저장할 수 있습니다.
이 코드를 사용할 수 있습니다.
<?php
$var = "This is Ashok's Pen.";
addslashes($var);
?>
mysqli_real_contract_string()이 동작하지 않는 경우.
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);
?>
$var = mysqli_real_escape_string($conn, $_POST['varfield']);
PHP 를 사용하고 있는 경우는, addslash() 함수를 사용합니다.
프로그램 액세스의 경우 플레이스 홀더를 사용하여 안전하지 않은 문자를 자동으로 이스케이프할 수 있습니다.
예를 들어 Perl DBI에서는 다음을 사용할 수 있습니다.
my $string = "This is Ashok's pen";
$dbh->do("insert into my_table(my_string) values(?)",undef,($string));
addslahes() 또는 mysql_real_escape_string() 중 하나를 사용합니다.
델파이를 사용하는 방법:
"탈옥"탈옥"
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에 텍스트 필드를 삽입하거나 업데이트할 수 있도록 합니다.
유사한 기능은 모든 프로그래밍 언어에서 찾을 수 있습니다!
MySQL 매뉴얼에서 기능을 확인하실 수 있습니다.
MYSQL 데이터베이스에 저장하고 싶은 API 응답 데이터입니다.견적서, HTML 코드 등이 포함되어 있습니다.
예:-
{
rewardName: "Cabela's eGiftCard $25.00",
shortDescription: '<p>adidas gift cards can be redeemed in over 150 adidas Sport Performance, adidas Originals, or adidas Outlet stores in the US, as well as online at <a href="http://adidas.com/">adidas.com</a>.</p>
terms: '<p>adidas Gift Cards may be redeemed for merchandise on <a href="http://adidas.com/">adidas.com</a> and in adidas Sport Performance, adidas Originals, and adidas Outlet stores in the United States.'
}
솔루션
CREATE TABLE `brand` (
`reward_name` varchar(2048),
`short_description` varchar(2048),
`terms` varchar(2048),
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=latin1;
삽입 중에 인은 JSON.stringify()에 이어
let brandDetails= {
rewardName: JSON.stringify(obj.rewardName),
shortDescription: JSON.stringify(obj.shortDescription),
term: JSON.stringify(obj.term),
}
위는 JSON 개체이고 아래는 MySQL에 데이터를 삽입하는 SQL Query입니다.
let query = `INSERT INTO brand (reward_name, short_description, terms)
VALUES (${brandDetails.rewardName},
(${brandDetails.shortDescription}, ${brandDetails.terms})`;
성공했어...
아무것도 동작하지 않는 경우는, 다음과 같이 시험해 주세요.
var res = str.replace(/'/g, "\\'");
var res = res.replace(/"/g, "\\\"");
이 명령어는 \escape 문자를 ' 및 '의 모든 항목에 추가합니다.
이것이 문제를 해결하는 올바른 방법인지 프로페셔널한 방법인지 확실하지 않다
효과가 있을 것으로 생각되지만, 실제 내용에서는 모든 따옴표와 큰따옴표가 \자로 바뀝니다.
Python 사용자로서 따옴표를 raw "로 바꿉니다.
don_not_work_str = "This is Ashok's Pen."
work_str = don_not_work_str.replace("'", r"\'")
Python i 입력이 다양하기 때문에 일이 아닌 ''를 탈출하기 위해 여러 가지 방법을 시도했습니다.
마지막으로 이 코드를 사용하면 데이터베이스의 데이터는 입력과 동일합니다.
tmp = val.replace('\\', r'\\')
ret = tmp.replace('"', r'\"')
언급URL : https://stackoverflow.com/questions/887036/how-to-escape-single-quotes-in-mysql
'source' 카테고리의 다른 글
봄에 일반 타입의 빈 오토와이어는? (0) | 2022.11.23 |
---|---|
자바에서 시차를 계산하려면 어떻게 해야 하나요? (0) | 2022.11.23 |
Vue JS에서 단일 파일의 구성 요소 변수 내부 스타일에 액세스하는 방법 (0) | 2022.11.23 |
MySQL에서 집계 함수 없이 "그룹화 기준" 쿼리를 허용하는 이유는 무엇입니까? (0) | 2022.11.23 |
0에서 1 사이의 난수? (0) | 2022.11.23 |