필드 이름 주위에 백틱 사용


172

여기에 몇 가지 SQL 질문에 대한 몇 가지 답변과 의견을 읽고 내 친구가 금지하는 정책이있는 곳에서 일하고 있다는 소식을 듣고 MySQL에서 필드 이름 주위에 백틱을 사용하는 데 문제가 있는지 궁금합니다. .

그건:

SELECT `id`, `name`, `anotherfield` ...
-- vs --
SELECT id, name, anotherfield ...

24
당신이 열 같은 이름을 갖고 싶어 역 따옴표 정말 편리 count, type, table또는 유사한
knittl


@knittl 나는 질문은 생각 해야 당신은 같은 열 이름을 가지고 count, type하고 table. 그것들은 끔찍하게 모호한 용어이며 거의 모든 경우에 그 이름을 좀 더 구체적으로 향상시킬 수 있습니다. 누군가가 백틱을 추가하는 것을 잊었을 때 또는 그들이 반드시 알아야 할 것을 알지 못하므로 열의 이름을 지정하는 것은 위험하고 잠재적 인 오류의 원인입니다. 예약어를 열 이름으로 사용하지 않는 것이 좋습니다.
dallin

나는 항상 그것들을 사용하므로 언제든지 예약 키워드를 사용하여 위험에 처하지 않습니다.
Markus Zeller

답변:


153

백틱을 사용하면 대체 문자를 사용할 수 있습니다. 쿼리 작성에서 그러한 문제는 아니지만 백틱을 사용할 수 있다고 가정하면 다음과 같은 어리석은 것들을 피할 수 있다고 가정합니다.

SELECT `id`, `my name`, `another field` , `field,with,comma` 

물론 이름이 잘못된 테이블을 생성합니다.

간결한 경우 문제가 발생하지 않으므로 쿼리를 실행하면 참고 할 것입니다.

EXPLAIN EXTENDED Select foo,bar,baz 

다시 생성 된 경고에는 백틱이 있으며 정규화 된 테이블 이름이 있습니다. 따라서 쿼리 생성 기능을 사용하고 쿼리를 자동으로 다시 작성하는 경우 백틱으로 인해 코드 구문 분석이 덜 혼동 될 수 있습니다.

그러나 백틱을 사용할 수 있는지 여부를 위임하는 대신 이름 표준이 있어야한다고 생각합니다. 더 많은 '실제'문제를 해결합니다.


PostgreSQL에서도 사용해야합니까?
Yousuf Memon

5
필요하지 않고 권장 사항 만 있습니다. 나중에 필드 이름을 공유하는 SQL 키워드가 추가되는 경우 SQL 키워드로 모호성을 피하기 위해 인용 부호를 나타내는 것이 유용합니다. 유일한 시간 당신 / 필요 / 필드 때 인용되는 않는 예를 들어, 키워드 이름을 공유, select count from fooselect "count" from foo매우 다른 결과를 줄 것이다. 그러나 postgres는 두 가지면에서 mysql과 다릅니다. 1. 필드는로 인용됩니다 "". 인용 부호가없는 필드는 대소 문자를 구분하지 않습니다 postgresql.org/docs/current/static/…
Kent Fredric

57

백틱의 유일한 문제는 ANSI-SQL과 호환되지 않는다는 것입니다. 예를 들어 SQL Server에서는 작동하지 않습니다.

SQL을 다른 데이터베이스로 이식해야 할 가능성이 있으면 큰 따옴표를 사용하십시오.


15
네. MySQL의 ANSI 모드 ( dev.mysql.com/doc/refman/5.0/en/server-sql-mode.html) 를 사용하여 MySQL에서 큰 따옴표를 사용하여 데이터베이스 간 호환성을 다시 확보하십시오. 향후 DBMS 버전에서 예약어가 될 내용을 전혀 모르기 때문에 백틱 / 따옴표도 필요합니다.
bobince

1
그건 사실이야! 서버 응용 프로그램 중 하나가 데이터베이스 엔진에 업그레이드를 적용하여 새 키워드를 추가 할 때까지 제대로 실행되었습니다. 갑자기 특정 테이블을 쿼리 한 모든 것이 손상되었습니다.
Miquella

I이었다 @bobince 새로운 디바이스로는, 나는 열 이름 range처럼이나 뭐. MySQL 5로 업그레이드했을 때 새로운 예약어이기 때문에 실패했습니다!
alex

1
큰 따옴표를 사용하지 마십시오. 항상 작동하지는 않습니다. 예를 들어 ... app_key_stores어디에서 삭제 ( "key"= 'c5cc4f30-31f3-0130-505e-14dae9da9fc5_range'); 쿼리 OK, 영향을받는 0 개의 행 (0.00 초) DELETE FROM app_key_storesWHERE ( key= 'c5cc4f30-31f3-0130-505e-14dae9da9fc5_range'); 쿼리 OK, 5 개의 행이 영향을 받음 (0.00 초)
Altonymous

44

나에게 필드 이름을 다룰 때 항상 사용하는 것이 합리적입니다.

  • 첫째, 일단 습관에 빠지면 백틱 키를 누르는 것이 아프지 않습니다.
  • 두 번째로, 쿼리의 필드가 정확히 무엇인지, 키워드 또는 메소드가 무엇인지 쉽게 볼 수 있습니다.
  • 마지막으로, 테이블을 디자인 할 때 원하는 필드 이름을 사용할 수 있습니다. 때로는 "키", "순서"또는 "값"필드의 이름을 지정하는 것이 합리적 일 수 있습니다. 모두 참조 할 때 백틱이 필요합니다.

19
또한 나중에 사용 된 예약어 (이전에 물린 적이 있음)로부터 보호 해줍니다.
alex

5
이런 이유로 내가 그들과 함께 모든 변수를 둘러싸고있는 정확한 이유이기 때문에 사실은, 사람이 편집을 나를 화나게 한 번 내 질문 중 하나의 밖으로 여분의 역 따옴표를했다
브라이언 Leishman

2
또한 영어 이외의 레이블을 안전하게 사용할 수 있으며 백틱 사용을 장려하기에 충분합니다.
Aternus

26

백틱은 표준 ANSI SQL의 일부가 아닙니다. 에서 MySQL의 설명서 :

ANSI_QUOTES SQL 모드가 사용 가능한 경우 큰 따옴표 안에 식별자를 인용 할 수도 있습니다.

따라서 백틱을 사용하고 MySQL에서 벗어나기로 결정하면 문제가 있습니다 (아마도 더 큰 문제가있을 수 있습니다)


9

MYSQL을 계속 사용하면 쿼리의 시각적 혼란을 제외하고는 아무 문제가 없습니다. 그러나 예약 된 키워드 또는 포함 된 공백을 테이블 및 열 이름으로 사용할 수 있습니다. 이것은 대부분의 데이터베이스 엔진에서 전혀 문제가되지 않으며 나중에 마이그레이션 할 수 없습니다.

쉽게 읽을 수 있도록 많은 사람들이 SQL 키워드에 대문자를 사용합니다 (예 :

SELECT some_fied, some_other_field FROM whatever WHERE id IS NULL;

6

나에게 묻는다면 항상 백틱을 사용해야합니다. 그러나 팀이 사용하지 않는 이유가 몇 가지 있습니다.

장점 :

  • 그것들을 사용하면 예약어나 금지 된 문자가 없습니다.
  • 경우에 따라 더 설명적인 오류 메시지가 나타납니다.
  • 나쁜 습관을 피하면 신경 쓰지 않지만 실제로는 SQL 삽입을 피할 수있는 좋은 방법입니다.

단점 :

  • 그것들은 표준이 아니며 보통 휴대용이 아닙니다. 그러나 식별자의 일부로 백틱을 사용하지 않는 한 (내가 상상할 수있는 최악의 방법 임) 자동으로 백틱을 제거하여 쿼리를 이식 ​​할 수 있습니다.
  • 일부 쿼리가 Access에서 온 경우 "로 테이블 이름을 인용 할 수 있습니다 ("맹목적으로 모든 "을 제거 할 수는 없습니다)). 그러나 백틱과 큰 따옴표의 혼합은 허용됩니다.
  • 일부 어리석은 소프트웨어 또는 함수는 쿼리를 필터링하며 백틱에 문제가 있습니다. 그러나 이들은 ASCII의 일부이므로 소프트웨어 / 기능이 매우 나쁘다는 것을 의미합니다.

9
백틱을 사용하는 것은 SQL 삽입을 피하는 것과 전혀 관련이 없습니다.
Andy Lester

6
@andy 도움 이 될 수 있습니다 . 공격자가 다른 백틱으로 닫아 주입해야하기 때문입니다. 그것은 거의하지 않지만 여전히
그래요

4

백틱에서 무언가를 찾기 위해 코드베이스를 검색하는 것이 훨씬 쉽습니다. 라는 테이블이 있다고 가정 해보십시오 event. grep -r "event" *수백 개의 결과를 반환 할 수 있습니다. grep -r "\`event\`" *아마도 데이터베이스를 참조하는 모든 것을 반환합니다.


일반적으로 실제로 이점은 아닙니다. 전문적으로 제공되는 테이블의 이름은 "general"보다 new_users_info와 비슷합니다.
ankush981

3

내가 아는 한, 백틱을 사용하는 전체 목적은 예약 키워드와 일치하는 이름을 사용할 수 있도록하는 것입니다. 따라서 이름이 예약 키워드와 충돌하지 않으면 백틱을 사용해야 할 이유가 없습니다. 그러나, 그것들을 금지 할 이유는 없습니다.


2

backtick에 대한 간단한 것 `` 은 database_name, table_name 등과 같은 식별자를 표시하는 데 사용하고 작은 따옴표 '' , 문자열 리터럴에는 큰 따옴표 "" 를 사용하는 반면 ""는 인쇄 값을 그대로 사용하고 ''값 변수 hold 또는 다른 경우에는 자신의 텍스트를 인쇄하십시오.

i.e 1.-> use `model`;   
    here `model` is database name not conflict with reserve keyword 'model'
2- $age = 27;
insert into `tbl_people`(`name`,`age`,`address`) values ('Ashoka','$age',"Delhi");

here i used both quote for all type of requirement. If anything not clear let me know..

0

일부 필드 이름을 기본 mysql 또는 mssql 값으로 사용하는 경우 (예 : "status") 백틱 ( "select statusfrom table_name"또는 "select id from table_name where status= 1") 을 사용해야 합니다. mysql은 오류를 반환하거나 쿼리를 작동하지 않기 때문입니다.


0

SQL에서 백틱 (`)의 주요 용도는 다음 절에서 다시 호출하려는 상황에서 사용하는 것입니다. 매번 큰 따옴표 ( "")를 사용하는 것이 좋습니다.

예를 들어

SELECT CONCAT(Name, ' in ', city, ', ', statecode) AS `Publisher and Location`,
    COUNT(ISBN) AS "# Books",
    MAX(LENGTH(title)) AS "Longest Title",
    MIN(LENGTH(title)) AS "Shortest Title"
FROM Publisher JOIN Book
ON Publisher.PublisherID = Book.PublisherID WHERE INSTR(name, 'read')>0
GROUP BY `Publisher and Location`
HAVING COUNT(ISBN) > 1;

위의 진술에서 당신은 어떻게 Publisher and Location다시 사용 되는지 볼 수 있습니까?GROUP BY 절 .

사용하는 대신

GROUP BY 이름, 도시,시 /도 코드

방금 사용한

GROUP BY Publisher and Location

이러한 상황이 발생할 때만 백틱을 사용하는 것이 좋습니다. 다른 모든 경우에는 큰 따옴표를 사용하는 것이 좋습니다.

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