[SQL] 때 MySQL의에서 작은 따옴표, 큰 따옴표, 및 역 따옴표를 사용하는
SQL때 MySQL의에서 작은 따옴표, 큰 따옴표, 및 역 따옴표를 사용하는
나는 쿼리를 작성하는 최선의 방법을 배우려고 노력하고 있습니다. 또한 일관성의 중요성을 이해합니다. 지금까지, 나는 무작위로 어떤 진짜 생각없이 작은 따옴표, 큰 따옴표, 및 역 따옴표를 사용했다.
예:
$query = 'INSERT INTO table (id, col1, col2) VALUES (NULL, val1, val2)';
또한, 상기의 예에서는 변수가 될 수 등이 테이블 COL1, VAL1을 고려한다.
이 표준은 무엇인가? 너 뭐하니?
나는 여기에 약 20 분 동안 비슷한 질문에 대한 답변을 읽어 봤는데,하지만이 질문에 확실한 대답이없는 것처럼 보인다.
해결법
-
==============================
1.역 따옴표는 테이블과 컬럼 식별자에 사용할 수 있지만, 식별자는 MySQL이 키워드 예약 된 경우에만 필요, 또는 식별자가 제한된 넘어 문자 또는 문자 (아래 참조)의 공백이 포함 된 경우 종종 예약 된 키워드를 사용하지 않는 것이 좋습니다 열 또는 테이블 식별자로 가능한 한 인용 문제를 회피 할 때.
역 따옴표는 테이블과 컬럼 식별자에 사용할 수 있지만, 식별자는 MySQL이 키워드 예약 된 경우에만 필요, 또는 식별자가 제한된 넘어 문자 또는 문자 (아래 참조)의 공백이 포함 된 경우 종종 예약 된 키워드를 사용하지 않는 것이 좋습니다 열 또는 테이블 식별자로 가능한 한 인용 문제를 회피 할 때.
작은 따옴표는 값 ()리스트와 같은 문자열 값에 사용되어야한다. 따옴표도 문자열 값에 대한 MySQL이 지원되지만 대신 이중의 작은 따옴표를 사용하는 것이 습관 그래서 작은 따옴표는 더 널리, 다른 RDBMS로 사용할 수 있습니다.
MySQL은 또한 DATE 및 DATETIME 리터럴 값은 단일 인용 '2001-01-01 0시 0분 0초'와 같은 문자열로 될 것으로 기대하고있다. 날짜 문자열에서 세그먼트 구분 기호로 - 하이픈을 사용하여 특히 대안으로, 자세한 내용은 날짜 및 시간 리터럴 설명서를 참조하십시오.
귀하의 예제를 사용 그래서, 나는 PHP 문자열을 큰 따옴표 것이며, 값 'val1과', '을 val2'에 작은 따옴표를 사용합니다. NULL은 MySQL의 키워드 및 특별 (비) - 값이며, 따라서 인용 부호로 둘러싸입니다.
(... 나중에 이것에)이 테이블 또는 열 식별자의 아무도는 예약 된 단어 나 인용이 필요한 문자의 메이크업 사용되지 않습니다,하지만 난 역 따옴표로 어쨌든 말을 인용했습니다.
그들의 주장은 이미 언급 한 같은 문자열이나 식별자를 인용 규칙이 적용됩니다 있지만 RDBMS에 대한 기본 기능 (예를 들어, NOW () MySQL은), 인용 할 수 없습니다.
Backtick (`) table & column ───────┬─────┬──┬──┬──┬────┬──┬────┬──┬────┬──┬───────┐ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ $query = "INSERT INTO `table` (`id`, `col1`, `col2`, `date`, `updated`) VALUES (NULL, 'val1', 'val2', '2001-01-01', NOW())"; ↑↑↑↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑↑↑↑↑ Unquoted keyword ─────┴┴┴┘ │ │ │ │ │ │ │││││ Single-quoted (') strings ───────────┴────┴──┴────┘ │ │ │││││ Single-quoted (') DATE ───────────────────────────┴──────────┘ │││││ Unquoted function ─────────────────────────────────────────┴┴┴┴┘
당신이 문자열에 직접 변수를 보간하려는 경우, 이중 인용 PHP에 있어야하지만 변수에 대한 인용 패턴은 변경되지 않습니다. 그냥 당신이 제대로 SQL에 사용하기 위해 변수를 탈출했다고합니다. (SQL 주입에 대한 보호로 대신 준비된 명령문을 지원하는 API를 사용하는 것이 좋습니다).
// Same thing with some variable replacements // Here, a variable table name $table is backtick-quoted, and variables // in the VALUES list are single-quoted $query = "INSERT INTO `$table` (`id`, `col1`, `col2`, `date`) VALUES (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의 문서에 따르면, 당신은 다음과 같은 문자 세트를 사용하여 (역 따옴표) 식별자를 인용 할 필요가 없습니다 :
당신은 예를 들어, 공백을 포함하여 테이블 또는 열 식별자로 해당 세트 이상의 문자를 사용할 수 있지만, 당신은 (역 따옴표)를 인용해야합니다.
-
==============================
2.MySQL은 따옴표의 두 가지 유형이 있습니다 :
MySQL은 따옴표의 두 가지 유형이 있습니다 :
그리고 특별한 경우 인 "이 그것은 MySQL 서버의 sql_mode에 따라 한 번에 상술 한 목적 중 하나에 사용될 수 있습니다. :
SELECT "column" FROM table WHERE foo = "bar"
쿼리는 열 foo는 문자열 "바"와 동일한 문자열 리터럴 "열"을 선택합니다
열 foo는 열 줄 동일 곳 쿼리는 열 열을 선택합니다
-
==============================
3.(이 질문의 SQL 자연에 대한 위의 좋은 답변입니다,하지만 당신은 PHP를 처음 사용하는 경우에도 관련이있을 수 있습니다.)
(이 질문의 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
-
==============================
4.역 따옴표는 일반적으로 식별자를 표시하는 데 사용뿐만 아니라 실수로 예약 된 키워드를 사용로부터 안전 할 수 있습니다.
역 따옴표는 일반적으로 식별자를 표시하는 데 사용뿐만 아니라 실수로 예약 된 키워드를 사용로부터 안전 할 수 있습니다.
예를 들면 :
Use `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')
-
==============================
5.MySQL은, 이러한 기호는, "쿼리를`구분하는 데 사용됩니다 '와 ().
MySQL은, 이러한 기호는, "쿼리를`구분하는 데 사용됩니다 '와 ().
-
==============================
6.MySQL과 PHP의 문자열 리터럴은 동일합니다.
MySQL과 PHP의 문자열 리터럴은 동일합니다.
당신의 문자열이 작은 따옴표가 포함 된 경우 그래서, 당신은 문자열을 인용 따옴표를 사용할 수 있습니다, 또는 큰 따옴표가 포함되어있는 경우에, 당신은 문자열을 인용 작은 따옴표를 사용할 수 있습니다. 당신의 문자열이 작은 따옴표와 큰 따옴표를 모두 포함하는 경우, 당신은 문자열을 인용하는 데 사용되는 하나를 탈출해야합니다.
우리는 PHP 문자열을 큰 따옴표를 사용할 필요가 있으므로 대부분, 우리는 SQL 문자열 값에 대한 작은 따옴표를 사용합니다.
$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를위한 것입니다. (하지만이 준비된 문은 더 좋다.)
-
==============================
7.PHP와 MySQL의 조합에서, 큰 따옴표와 작은 따옴표는 쿼리 쓰기 때문에 시간이 훨씬 용이합니다.
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']." ')";
이것은 MySQL의에 PHP 변수를 사용하는 것이 좋습니다.
-
==============================
8.일반적으로 두 가지 점에 남중, 여기에 많은 도움이 답변이 있었다.
일반적으로 두 가지 점에 남중, 여기에 많은 도움이 답변이 있었다.
및 @MichaelBerkowski 말했다로
식별자가 둘 다 예약 된 키워드가 될하거나 반드시 주변 역 따옴표를 요구 공백 또는 제한된 넘어 문자 만 포함 할 수있는 곳 비록 경우가 있습니다.
예
123E10은 유효한 식별자 이름뿐만 아니라 유효한 정수 리터럴입니다.
[당신이 이러한 식별자 이름을 얻을 것입니다 방법을 자세히 들어가없이, 내가 123456e6라는 이름의 임시 테이블을 만들 가정하자.
역 따옴표에 어떤 오류 없습니다.
DB [XXX]> create temporary table `123456e6` (`id` char (8)); Query OK, 0 rows affected (0.03 sec)
ERROR 역 따옴표를 사용하지.
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도 지수 수 있기 때문 완전히이다.
-
==============================
9.테이블 COLS 및 값 변수 인 경우 다음 두 가지 방법이 있습니다 :
테이블 COLS 및 값 변수 인 경우 다음 두 가지 방법이 있습니다 :
큰 따옴표 ""전체 쿼리 :
$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` <- 참고 : 제외합니다. 다시 틱에서.
-
==============================
10.작은 따옴표는 값 ()리스트와 같은 문자열 값에 사용되어야한다.
작은 따옴표는 값 ()리스트와 같은 문자열 값에 사용되어야한다.
역 따옴표는 일반적으로 식별자를 표시하는 데 사용뿐만 아니라 실수로 예약 된 키워드로부터 안전 할 수 있습니다.
PHP와 MySQL의 조합에서, 큰 따옴표와 작은 따옴표는 쿼리 쓰기 때문에 시간이 훨씬 쉽게합니다.
-
==============================
11.제 (잘 설명) 답변의 모든 외에도, 거기가 언급 한 다음이었다 나는 꽤 자주이 Q & A를 방문하지 않았습니다.
제 (잘 설명) 답변의 모든 외에도, 거기가 언급 한 다음이었다 나는 꽤 자주이 Q & A를 방문하지 않았습니다.
간단히 말해서, MySQL은 당신이 그런 전자 마이너스 메일로 "전자 메일"로 자신의 테이블 / 컬럼 및 해석 하이픈에 수학을하고 싶은 생각합니다.
면책 조항 : 그래서 내가 데이터베이스 작업에 완전히 새로운 누가 기술 용어가 이미 설명 이해하지 못하는 사람들에 대한 대답의 "참고"파일 형식이 추가 거라 생각 했어요.
-
==============================
12.SQL 서버와 MySQL, PostgreSQL을, 오라클은 "() 따라서 쿼리에 따옴표가 없어야한다. ()"따옴표를 이해하지 않고 단지 작은 따옴표 ( ')를 사용해야합니다.
SQL 서버와 MySQL, PostgreSQL을, 오라클은 "() 따라서 쿼리에 따옴표가 없어야한다. ()"따옴표를 이해하지 않고 단지 작은 따옴표 ( ')를 사용해야합니다.
백 - 여행 (`) SQL에서 사용하는 선택 사항이며 테이블 이름, DB 이름과 열 이름에 사용됩니다.
당신이 전화의 MySQL을 백 엔드에 쓰기 쿼리하려고하는 경우에 당신은 같은 변수에 할당 질의에 큰 따옴표 ( ") 또는 작은 따옴표 ( ')를 사용할 수 있습니다 :
let query = "select id, name from accounts"; //Or let query = 'select id, name from accounts';
쿼리의 경우 문이 있다면 및 / 또는 값 및 / 또는 같은이 값에 대한 문자열을 사용 작은 따옴표 ( ')는 값의 업데이트를 삽입하려고 :
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.
큰 따옴표 ( ")와 작은 따옴표를 사용하는 경우이 혼란 빠져하려면 ( ')와 같은 ()이 백 슬래시 (포함), 작은 따옴표와 스틱 추천 할 것'
let query = 'select is, name from accounts where name = \'John\'';
( ') 우리가 어떤 가치 동적 할당과 같은 일부 문자열 연결을 수행했을 때 따옴표가 발생 따옴표 ( ") 또는 단일에 문제가 있습니다 :
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 + '\'';
필요 더 여유가 자바 스크립트에 따옴표를 수행 할 경우
from https://stackoverflow.com/questions/11321491/when-to-use-single-quotes-double-quotes-and-backticks-in-mysql by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] 어떻게 SQL 서버에서 하나의 텍스트 문자열에 여러 행의 텍스트를 연결하는? (0) | 2020.03.04 |
---|---|
[SQL] 각 그룹의 마지막 레코드를 가져 - MySQL의 (0) | 2020.03.04 |
[SQL] 각 GROUP BY 그룹에서 첫 번째 행을 선택? (0) | 2020.03.04 |
[SQL] 2005 마이크로 소프트 SQL 서버에서 GROUP_CONCAT MySQL의 기능을 시뮬레이션? (0) | 2020.03.04 |
[SQL] 열에 최대 값 행만에서 SQL [중복] (0) | 2020.03.04 |