MySQL에서 작은 따옴표, 큰 따옴표 및 백틱을 사용하는 경우


633

쿼리를 작성하는 가장 좋은 방법을 배우려고합니다. 또한 일관성의 중요성을 이해합니다. 지금까지는 아무 생각없이 작은 따옴표, 큰 따옴표 및 백틱을 무작위로 사용했습니다.

예:

$query = 'INSERT INTO table (id, col1, col2) VALUES (NULL, val1, val2)';

또한, 상기 예에서, 그 고려 table, col1, val1등의 변수 일 수있다.

이것의 표준은 무엇입니까? 너 뭐하니?

약 20 분 동안 비슷한 질문에 대한 답변을 읽었지만이 질문에 대한 명확한 대답이없는 것 같습니다.


16
이것은 매우 MySQL 관련 질문입니다. 일반적으로 SQL (예 : ISO / ANSI SQL)에는 다른 따옴표 세트가 있습니다. 큰 따옴표는 예를 들어 구분 된 식별자를위한 "tablename"것이고 작은 따옴표는 리터럴을위한 것 'this is a some text'입니다. 백틱은 표준 SQL에서 사용되지 않습니다. (식별자에 큰 따옴표를 포함해야하는 경우에는 따옴표로 두 번 입력하십시오 "odd""tablename". 마찬가지로, 따옴표와 같이 리터럴로 큰 따옴표를 두 번 입력하십시오 'Conan O''Brien'.)
jarlh

답변:


609

백틱은 테이블 및 열 식별자에 사용되지만 식별자가 MySQL 예약 키워드 이거나 식별자에 공백 문자 또는 한정된 세트를 벗어난 문자가 포함 경우에만 필요합니다 (아래 참조). 예약 키워드를 사용하지 않는 것이 좋습니다. 인용 문제를 피하면서 가능하면 열 또는 테이블 식별자로 사용하십시오.

VALUES()목록 에서와 같이 문자열 값에는 작은 따옴표를 사용해야 합니다. 문자열 값은 MySQL에서 큰 따옴표를 지원하지만 다른 RDBMS에서는 작은 따옴표를 더 널리 사용하므로 큰 따옴표 대신 작은 따옴표를 사용하는 것이 좋습니다.

MySQL은 또한 리터럴 값이 DATEDATETIME같은 문자열로 작은 따옴표로 묶기를 기대 '2001-01-01 00:00:00'합니다. 문의 날짜 및 시간 리터럴 하이픈을 사용하여 특정 대안에 자세한 내용은 문서를, -날짜 문자열에서 세그먼트 구분 기호로.

따라서 예제를 사용하여 PHP 문자열을 큰 따옴표로 묶고 값에 작은 따옴표를 사용합니다 'val1', 'val2'. NULL는 MySQL 키워드이며 특수 (비) 값이므로 인용 부호가 없습니다.

이 테이블 또는 열 식별자는 예약어이거나 인용이 필요한 문자를 사용하지 않지만 어쨌든 백틱으로 인용했습니다 (나중에 자세히 설명합니다).

RDBMS에 고유 한 함수 (예 : NOW()MySQL에서)는 인용 할 수 없지만 인수에 이미 언급 된 동일한 문자열 또는 식별자 인용 규칙이 적용됩니다.

백틱 (`)
테이블 및 열 ───────┐
                      ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓
$ query = " 테이블에 삽입하기 (`id`,`col1`,`col2`,`date`,`updated`)
                       값 (NULL, 'val1', 'val2', '2001-01-01', NOW ()) ";
                               ↑↑↑↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑↑↑↑↑ 
따옴표없는 키워드 ─────┴┴┴┘ │ │ │ │ │ │ ││││││
작은 따옴표 ( ') 문자열 ───────────┴────┴──┴────┘ │ │ │││││
작은 따옴표 ( ') 날짜 ─────────────────────────────────── │
따옴표없는 기능    

변수 보간

변수의 인용 패턴은 변경되지 않지만 문자열에서 변수를 직접 보간하려는 경우 PHP에서 큰 따옴표를 사용해야합니다. SQL에서 사용하기 위해 변수를 올바르게 이스케이프했는지 확인하십시오. ( SQL 주입을 방지하기 위해 준비된 명령문을 지원하는 API를 대신 사용하는 것이 좋습니다 ).

// 일부 변수 대체와 같은 것
// 여기서 변수 테이블 이름 $ table은 역 따옴표로 묶이고 변수는
// VALUES 목록에서 작은 따옴표로 묶습니다. 
$ query = " `$ table '에 삽입 (`id`,`col1`,`col2`,`date`) 값 (NULL, '$ val1 ' , '$ val2 ' , '$ date ' )";

준비된 진술

준비된 진술로 작업 할 때 설명서의 자리 표시자를 인용해야하는지 여부를 확인하려면 설명서를 참조하십시오. PHP, PDO 및 MySQLi에서 사용할 수있는 가장 인기있는 API는 다른 언어에서 가장 준비된 명령문 API와 같이 인용 부호가없는 자리 표시자를 예상 합니다.

// PDO example with named parameters, unquoted
$query = "INSERT INTO `table` (`id`, `col1`, `col2`, `date`) VALUES (:id, :col1, :col2, :date)";

// MySQLi example with ? parameters, unquoted
$query = "INSERT INTO `table` (`id`, `col1`, `col2`, `date`) VALUES (?, ?, ?, ?)";

식별자에서 역 따옴표를 요구하는 문자 :

MySQL 문서에 따르면 다음 문자 세트를 사용하여 식별자를 인용 (백틱) 할 필요가 없습니다.

ASCII : [0-9,a-z,A-Z$_](기본 라틴 문자, 숫자 0-9, 달러, 밑줄)

예를 들어 공백을 포함하여 해당 세트 이상의 문자를 테이블 또는 열 식별자로 사용할 수 있지만 인용 부호 (백틱) 를 사용해야 합니다.


43
" 그러나 작은 따옴표는 다른 RDBMS에 의해보다 널리 받아 들여진다 "– 문자열 리터럴에 작은 따옴표를 사용하는 것은 SQL 표준에 의해 정의되고 필요하다
a_horse_with_no_name

@a_horse_with_no_name 거의 아무도 ANSI MySQL을 사용하지 않습니다 ( '|'문자열 연결-정말?)
Good Person

3
이것은 사실이 아니다 : "MySQL은 또한 DATE와 DATETIME 리터럴 값이 '2001-01-01 00:00:00'과 같은 문자열로 작은 따옴표로
묶을

3
@evilReiko MySQL 문서는 별칭 인용을 명확하게 다루지 않습니다. 별명에 대해 단일, 이중 또는 백틱을 허용하지만 다른 ANSI SQL 모드의 영향을받을 수 있습니다. 별칭이 따옴표에 필요한 SQL 사양이 무엇인지 잘 모르겠습니다. 개인 취향 : 일관성을 위해 열 식별자와 동일하게 인용합니다. 즉, 필요한 경우 백 틱하거나 인용하지 않은 경우 인용하지 않습니다. 별칭에 작은 따옴표 나 큰 따옴표를 사용하지 않습니다.
Michael Berkowski

2
@GuneyOzsan 예, 매우 취약합니다. 허용 가능한 테이블 이름 목록에 대해 유효성이 검증되지 않은 한 테이블 이름에 변수를 사용하지 마십시오. 허용 ​​가능한 이름의 배열을 작성하고 변수가 사용하기에 안전한지 확인하기 위해 목록의 변수와 일치하는지 확인하십시오. 그렇지 않으면 사용하기 위해 테이블 ​​이름 변수를 안전하게 이스케이프 할 수 없습니다.
Michael Berkowski

121

MySQL에는 두 가지 유형의 따옴표가 있습니다.

  1. ' 문자열 리터럴을 묶기위한 것
  2. ` 테이블 및 열 이름과 같은 식별자를 묶는 데 사용

그리고 "특별한 경우가 있습니다. MySQL 서버에 따라 한 에 위에서 언급 한 목적 중 하나로 사용될 수 있습니다 sql_mode.

  1. 기본적 으로 "문자는 다음과 같이 문자열 리터럴을 묶는 데 사용될 수 있습니다'
  2. 에서 ANSI_QUOTES모드 "캐릭터처럼 식별자를 둘러싸는 데 사용 할 수 있습니다`

다음 쿼리는 SQL 모드에 따라 다른 결과 (또는 오류)를 생성합니다.

SELECT "column" FROM table WHERE foo = "bar"

ANSI_QUOTES 비활성화

쿼리는 "column"foo이 문자열과 같은 문자열 리터럴을 선택 합니다."bar"

ANSI_QUOTES 활성화

쿼리는 열 column이 열과 foo같은 열을 선택합니다bar

사용시기

  • "코드가 SQL 모드와 독립적이되도록 사용하지 않는 것이 좋습니다.
  • 모범 사례이므로 항상 식별자를 인용하십시오 (SO에 대해 몇 가지 질문을하십시오).

32

(질문의 SQL 특성과 관련하여 위의 좋은 답변이 있지만 PHP를 처음 사용하는 경우에도 관련이 있습니다.)

아마도 PHP는 작은 따옴표와 큰 따옴표로 묶인 문자열을 다르게 처리한다고 언급하는 것이 중요합니다 ...

작은 따옴표로 묶인 문자열은 '리터럴'이며 거의 WYSIWYG 문자열입니다. 큰 따옴표로 묶인 문자열은 가능한 변수 대체를 위해 PHP에 의해 해석됩니다 (PHP의 백틱은 정확히 문자열이 아니며 셸에서 명령을 실행하고 결과를 반환 함).

예 :

$foo = "bar";
echo 'there is a $foo'; // There is a $foo
echo "there is a $foo"; // There is a bar
echo `ls -l`; // ... a directory list

23

역 따옴표는 일반적으로를 나타내는 데 사용됩니다 identifier뿐만 아니라 수 안전한 실수로 사용에서 예약 된 키워드 .

예를 들면 다음과 같습니다.

Use `database`;

여기서 백틱은 서버가 database실제로 데이터베이스 식별자가 아니라 데이터베이스의 이름 임을 이해하는 데 도움 이됩니다.

테이블 이름과 필드 이름에 대해서도 동일하게 수행 할 수 있습니다. 데이터베이스 식별자를 백틱으로 래핑 하는 경우 이는 매우 좋은 습관 입니다.

백틱에 대한 자세한 내용을 보려면 답변을 확인하십시오 .


큰 따옴표 및 작은 따옴표에 대해 이제

그러나 값을 정의하려면 작은 따옴표 나 큰 따옴표를 사용해야합니다. 다른 예를 보자.

INSERT INTO `tablename` (`id, `title`) VALUES ( NULL, title1);

여기서 나는 title1따옴표 로 감싸는 것을 잊어 버렸습니다 . 이제 서버는 title1열 이름 (즉, 식별자)으로 사용합니다. 따라서 값임을 나타내려면 큰 따옴표 나 작은 따옴표를 사용해야합니다.

INSERT INTO `tablename` (`id, `title`) VALUES ( NULL, 'title1');

이제 PHP와 함께 큰 따옴표와 작은 따옴표를 사용하면 쿼리 작성 시간이 훨씬 쉬워집니다. 질문에 수정 된 버전의 검색어를 보겠습니다.

$query = "INSERT INTO `table` (`id`, `col1`, `col2`) VALUES (NULL, '$val1', '$val2')";

이제 PHP에서 따옴표를 사용하여, 당신은 변수를 만들 것입니다 $val1, 그리고 $val2따라서 완벽하게 유효한 쿼리를 만들고 그 값을 사용합니다. 처럼

$val1 = "my value 1";
$val2 = "my value 2";
$query = "INSERT INTO `table` (`id`, `col1`, `col2`) VALUES (NULL, '$val1', '$val2')";

할 것

INSERT INTO `table` (`id`, `col1`, `col2`) VALUES (NULL, 'my value 1', 'my value 2')

15

MySQL은, 이러한 기호는 쿼리를 구분하는 데 사용되는 `, ", '().

  1. "또는 '문자열과 같은 값을 둘러싸에 사용됩니다 "26-01-2014 00:00:00"또는 '26-01-2014 00:00:00'. 이 기호는 집계되지 기능이 좋아, 단지 문자열입니다 now, sum또는 max.

  2. ` 테이블 또는 열 이름을 묶는 데 사용됩니다 (예 : select `column_name` from `table_name` where id='2'

  3. ()쿼리 예를 들어 단순히 묶으 부분 select `column_name` from `table_name` where (id='2' and gender='male') or name='rakesh'.


13

MySQL과 PHP의 문자열 리터럴은 동일합니다.

문자열은 작은 따옴표 ( " '") 또는 큰 따옴표 ( "" ") 문자로 묶인 일련의 바이트 또는 문자입니다.

따라서 문자열에 작은 따옴표가 포함 된 경우 큰 따옴표를 사용하여 문자열을 인용하거나 큰 따옴표가 포함 된 경우 작은 따옴표를 사용하여 문자열을 인용 할 수 있습니다. 그러나 문자열에 작은 따옴표와 큰 따옴표가 모두 포함되어 있으면 문자열을 인용 할 때 사용한 따옴표를 이스케이프해야합니다.

대부분 SQL 문자열 값에는 작은 따옴표를 사용하므로 PHP 문자열에는 큰 따옴표를 사용해야합니다.

$query = "INSERT INTO table (id, col1, col2) VALUES (NULL, 'val1', 'val2')";

PHP의 큰 따옴표로 묶은 문자열에 변수를 사용할 수 있습니다.

$query = "INSERT INTO table (id, col1, col2) VALUES (NULL, '$val1', '$val2')";

그러나 작은 따옴표 가 $val1있거나 $val2포함되어 있으면 SQL이 잘못됩니다. 따라서 SQL에서 사용하기 전에 이스케이프 처리해야합니다. 그것이 무엇 mysql_real_escape_string을위한 것입니다. (준비된 진술이 더 낫지 만)


12

PHP와 MySQL을 함께 사용하면 큰 따옴표와 작은 따옴표를 사용하여 쿼리 작성 시간을 훨씬 쉽게 만들 수 있습니다.

$query = "INSERT INTO `table` (`id`, `col1`, `col2`) VALUES (NULL, '$val1', '$val2')";

이제 직접 사후 변수를 MySQL 쿼리에 사용한다고 가정하면 다음과 같이 사용하십시오.

$query = "INSERT INTO `table` (`id`, `name`, `email`) VALUES (' ".$_POST['id']." ', ' ".$_POST['name']." ', ' ".$_POST['email']." ')";

이것은 PHP 변수를 MySQL에 사용하는 가장 좋은 방법입니다.


따라서 큰 따옴표는 유연하지만 식별자로 사용할 수 없습니다.
rhavendc

쿼리에서 이스케이프 처리되지 않은 사용자 입력을 직접 사용하지 마십시오!
jankal

@jankal이 본보기가 지정된 단지 것 당신이 다음 N 다음 사용자가 직접 입력을 사용하는 경우 ...........
또는 Vipul sorathiya

@vipulsorathiya 답변에서 POST 변수를 이스케이프 처리하도록 지정하십시오. 이제 쿼리에서 직접 사용하는 것을 가리키고 있습니다. 이 시도 초보자를위한 나쁜 ...
RFLdev

12

여기에는 많은 유용한 답변이 있으며 일반적으로 두 가지 요점으로 끝납니다.

  1. BACKTICKS (`)는 식별자 이름 주위에 사용됩니다.
  2. 단일 인용 부호 ( ')는 값 주위에 사용됩니다.

그리고 @MichaelBerkowski가 말한 것처럼

백틱은 표 및 열 식별자에 사용되지만 식별자가 MySQL예약 키워드이거나 식별자에 공백 문자 또는 한정된 집합을 벗어난 문자가 포함 된 경우에만 필요합니다 (아래 참조). 예약 키워드를 다음과 같이 사용하지 않는 것이 좋습니다. 인용 문제를 피하면서 가능하면 열 또는 테이블 식별자.

식별자가 예약 키워드 가 아니 거나 공백 이나 제한된 세트를 초과하는 문자를 포함 할 수 있지만 반드시 주위에 백틱이 필요한 경우가 있습니다.

123E10유효한 식별자 이름이지만 유효한 INTEGER리터럴입니다.

[그러한 식별자 이름을 얻는 방법에 대해 자세히 설명하지 않고]라는 임시 테이블을 만들고 싶다고 가정합니다 123456e6.

백틱에 오류가 없습니다.

DB [XXX]> create temporary table `123456e6` (`id` char (8));
Query OK, 0 rows affected (0.03 sec)

백틱을 사용하지 않으면 오류가 발생합니다.

DB [XXX]> create temporary table 123451e6 (`id` char (8));
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '123451e6 (`id` char (8))' at line 1

그러나 123451a6완벽하게 훌륭한 식별자 이름입니다 (뒤 진드기 없음).

DB [XXX]> create temporary table 123451a6 (`id` char (8));
Query OK, 0 rows affected (0.03 sec)

이것은 1234156e6또한 지수 숫자 이기 때문에 완전히 입니다.


10

테이블 열과 값이 변수이면 두 가지 방법이 있습니다.

큰 따옴표 ""로 전체 쿼리 :

$query = "INSERT INTO $table_name (id, $col1, $col2)
                 VALUES (NULL, '$val1', '$val2')";

또는

 $query = "INSERT INTO ".$table_name." (id, ".$col1.", ".$col2.")
               VALUES (NULL, '".$val1."', '".$val2."')";

작은 따옴표로 '':

$query = 'INSERT INTO '.$table_name.' (id, '.$col1.', '.$col2.')
             VALUES (NULL, '.$val1.', '.$val2.')';

``열 / 값 이름이 MySQL 예약 키워드와 유사한 경우 백틱을 사용하십시오 .

참고 : 테이블 이름으로 열 이름을 나타내는 경우 다음과 같이 백틱을 사용하십시오.

`table_name`. `column_name` <-참고 : 백틱 . 에서 제외하십시오 .


8

VALUES () 목록에서와 같이 문자열 값에는 작은 따옴표를 사용해야합니다.

백틱은 일반적으로 식별자를 나타 내기 위해 사용되며 예약 된 키워드를 실수로 사용하지 않도록 안전합니다.

PHP와 MySQL의 조합으로 큰 따옴표와 작은 따옴표는 쿼리 작성 시간을 훨씬 더 쉽게 만듭니다.


4

모든 (잘 설명 된) 답변 외에도 다음에 언급되지 않았 으며이 Q & A를 자주 방문합니다.

간단히 말해서; MySQL은 자체 테이블 / 열에서 수학 을하고 싶다고 생각하고 "전자 메일"과 같은 하이픈을 e 빼기 ( -)로 해석 mail합니다.


면책 조항 : 데이터베이스에 익숙하지 않고 이미 설명한 기술적 용어를 이해하지 못하는 사람들을 위해 이것을 "FYI"유형의 답변으로 추가 할 것이라고 생각했습니다.


1

SQL 서버와 MySQL, PostgreySQL, Oracle은 큰 따옴표 ( ")를 이해하지 못하므로 쿼리에는 큰 따옴표 (")가 없어야하며 작은 따옴표 ( ') 만 사용해야합니다.

Back-trip (`)은 SQL에서 사용하기위한 선택적이며 테이블 이름, db 이름 및 열 이름에 사용됩니다.

백엔드에서 쿼리를 작성하여 MySQL을 호출하려는 경우 큰 따옴표 ( ") 또는 작은 따옴표 ( ')를 사용하여 다음과 같은 변수에 쿼리를 할당 할 수 있습니다.

let query = "select id, name from accounts";
//Or
let query = 'select id, name from accounts';

THER가 있다면 where및 / 또는하려고 쿼리의 문 insert값 및 / 또는 update같은이 값에 대한 문자열을 사용 작은 따옴표 ( ')입니다 값은 :

let querySelect = "select id, name from accounts where name = 'John'";
let queryUpdate = "update accounts set name = 'John' where id = 8";
let queryInsert = "insert into accounts(name) values('John')";

//Please not that double quotes are only to be used in assigning string to our variable not in the query
//All these below will generate error

let querySelect = 'select id, name from accounts where name = "John"';
let queryUpdate = 'update accounts set name = "John" where id = 8';
let queryInsert = 'insert into accounts(name) values("John")';

//As MySQL or any SQL doesn't understand double quotes("), these all will generate error.

큰 따옴표 ( ")와 작은 따옴표 ( ')를 사용할 때이 혼동을 피하려면 작은 따옴표 (')를 사용하는 것이 좋습니다. 여기에는 backslash ()가 포함됩니다.

let query = 'select is, name from accounts where name = \'John\'';

double ( ") 또는 single ( ') 따옴표 문제는 값을 동적으로 할당하고 다음과 같은 문자열 연결을 수행해야 할 때 발생합니다.

let query = "select id, name from accounts where name = " + fName + " " + lName;
//This will generate error as it must be like name = 'John Smith' for SQL
//However our statement made it like name = John Smith

//In order to resolve such errors use
let query = "select id, name from accounts where name = '" + fName + " " + lName + "'";

//Or using backslash(\)
let query = 'select id, name from accounts where name = \'' + fName + ' ' + lName + '\'';

추가 정리가 필요하면 JavaScript에서 따옴표를 따르 십시오.

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