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

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

예:

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

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

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

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



답변

백틱은 테이블 및 열 식별자에 사용되지만 식별자가 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, 달러, 밑줄)

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


답변

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에 대해 몇 가지 질문을하십시오).

답변

(질문의 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


답변

역 따옴표는 일반적으로를 나타내는 데 사용됩니다 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')


답변

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'.


답변

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을위한 것입니다. (준비된 진술이 더 낫지 만)


답변

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에 사용하는 가장 좋은 방법입니다.