2014-11-19 6 views
0

나는 MySQL의 문에서 해당 문자열 리터럴은 다음과 같이 작은 따옴표로 포함시킬 필요가 알고따옴표

SELECT * FROM my_table WHERE str_column='test' 

나는 또한 포함하는 좋은 이유가 궁금 그러한 인용 부호 안의 비 문자열 리터럴, 예. 이 같은 :

SELECT * FROM my_table WHERE int_column='1' 

대신

SELECT * FROM my_table WHERE int_column=1 

의이 작은 따옴표와 문자열이 아닌 리터럴을 포함하는 어떤 의미가 있습니까? 아니면 그냥 바이트 낭비입니까?

답변

0

맞아요, 숫자 리터럴을 인용 할 필요는 없습니다. 그러나 나는 그것이 자주하는 것을 본다.

숫자 리터럴을 인용 할 때 단점도 없습니다. 예를 들어 INT 열과 비교하거나 산술 표현식에서 사용되는 경우와 같이 숫자 컨텍스트에서 사용될 때 MySQL은 자동으로 숫자 값으로 변환합니다.

숫자 리터럴을 인용하는 것이 가장 유용한 경우는 응용 프로그램 변수를 SQL 문자열로 삽입 할 때입니다. 예를 들어

:

<?php 
$num = $_POST['num']; 
$sql = "SELECT * FROM my_table WHERE int_column = $num"; // not safe! SQL injection hazard! 

'NUM'매개 변수가 정수 될 것으로 예상된다하더라도 악의적 인 사용자가 별도의 SQL 구문을 포함하는 문자열 매개 변수를 전달하고, 따라서 응용 프로그램을 악용 할 수 있습니다.

수정 프로그램은 real_escape_string()을 사용할 수 있지만이 경우 변수는 SQL에서 인용 문자열에 포함될 것으로 가정합니다.

<?php 
$num = $mysqli->real_escape_string($_POST['num']); 
$sql = "SELECT * FROM my_table WHERE int_column = '$num'"; // safer 

그러나이 숫자가 아닌 내용을 제거 할, 일반 정수로 숫자 변수를 강제하는 동등하게 안전 할 것입니다 : 그래서 당신은 당신의 SQL 식에 인용 한 다음 이스케이프 된 값을 보간 할 필요가 :

<?php 
$num = (int) $_POST['num']; 
$sql = "SELECT * FROM my_table WHERE int_column = $num"; // safe too 

마지막으로 쿼리 매개 변수를 사용하는 것이 가장 안전합니다. 그렇다면 변수를 인용하거나 따 내지 필요가 없습니다.

+0

나는 숫자가 필요한 열에 문자열을 삽입하는 데 "단점이 없다"는 것에 동의하지 않습니다. 최소한 그것은 마법이 일어나고 있음을 나타내는 의견을 말합니다. IMO 코드 냄새입니다. – Air

+1

@AirThomas, 그것은 마법이 아니며, SQL의 동작을 문서화 한 것입니다. http://dev.mysql.com/doc/refman/5.6/en/type-conversion.html 또한 많은 프로그래밍 언어 (특히 동적 또는 스크립팅 언어)에서 문자열의 숫자 리터럴이 자동으로 변환되는 것은 일반적입니다. 숫자적인 맥락에서. –

1

모든 값에 대해 작은 따옴표를 사용하여 향후 열 변경을 방지합니다. 예를 들어, 제품 ID는 INT, 12였습니다. 어느 시점에서 우리는 경영진이 영숫자 제품 ID를 원했던 몇 가지 서비스를 추가했습니다. productID를 VarChar, 20으로 변경했으며 코드의 어느 것도 비트를 건너 뛰지 않았습니다.

+1

이 사용 사례에 대한 좋은 지적이지만, FWIW는 쿼리 매개 변수를 사용하여 해결할 수도 있습니다. –

+0

Very true @Bill, 그러나 나는 수년간의 레거시 코드를 다루고있다. 우리는 천천히 그러나 확실하게 업데이트하고 있습니다 만, 그것은 그것이 무엇인지입니다. –