열 이름으로 사용 된 예약어를 어떻게 이스케이프합니까? MySQL / 테이블 생성


139

.NET의 클래스에서 테이블을 생성하고 있는데 한 가지 문제는 클래스 key에 예약 된 MySQL 키워드 인 필드 이름 이 있을 수 있다는 것입니다 . create table 문에서 어떻게 이스케이프 처리합니까? (참고 : 아래의 다른 문제는 텍스트가 색인 / 고유 한 고정 크기이어야한다는 것입니다)

create table if not exists misc_info (
id INTEGER PRIMARY KEY AUTO_INCREMENT NOT NULL,
key TEXT UNIQUE NOT NULL,
value TEXT NOT NULL)ENGINE=INNODB;

답변:


184

ANSI SQL 모드 가 활성화 된 경우 큰 따옴표를 사용할 수 있습니다

CREATE TABLE IF NOT EXISTS misc_info
  (
     id    INTEGER PRIMARY KEY AUTO_INCREMENT NOT NULL,
     "key" TEXT UNIQUE NOT NULL,
     value TEXT NOT NULL
  )
ENGINE=INNODB; 

그렇지 않으면 독점적 인 백 진드기 탈출. ( `다양한 키보드 레이아웃 에서 문자 를 찾는 위치는 이 답변 에서 다룹니다. )

CREATE TABLE IF NOT EXISTS misc_info
  (
     id    INTEGER PRIMARY KEY AUTO_INCREMENT NOT NULL,
     `key` TEXT UNIQUE NOT NULL,
     value TEXT NOT NULL
  )
ENGINE=INNODB; 

(출처 : MySQL 참조 매뉴얼, 9.3 예약어 )


5
IMHO는 항상 모든 필드 이름과 테이블 이름을 인용해야합니다.
rjmunro

10
@rjmunro-이렇게하면 이후 버전에서 도입되는 새로운 예약 키워드로부터 보호하기 때문에 다소 방어 적이지만 시각적 혼란을 좋아하지 않습니다.
Martin Smith

Cassandra의 CQL에서도 키워드에 대해 동일한 수정 (이중 인용 부호)을 사용할 수 있습니다. 약간의 주제는 아니지만 알고 있지만이 스레드는 Cassandra 관련 검색에서 나타났습니다.
Godfrey Duke

현재 MySQL 참조 매뉴얼 링크가 끊어졌습니다. 실제 링크 : dev.mysql.com/doc/refman/5.7/en/keywords.html
Miha_x64

71

백틱 문자 (`)를 사용해야합니다. 예 :

create table if not exists misc_info (
id INTEGER PRIMARY KEY AUTO_INCREMENT NOT NULL,
`key` TEXT UNIQUE NOT NULL,
value TEXT NOT NULL)ENGINE=INNODB;

15

다른 SQL Server 간의 이식성에 관심이있는 경우 ANSI SQL 쿼리를 사용해야합니다. ANSI SQL에서 문자열 이스케이프 처리는 큰 따옴표 ( ")를 사용하여 수행됩니다. 불행하게도이 이스케이프 방법은 ANSI 호환 모드로 설정되어 있지 않으면 MySQL로 이식 할 수 없습니다.

개인적으로, 나는 항상 --sql-mode = 'ANSI'인수로 MySQL 서버를 시작합니다. 설정되지 않았거나 자신이 제어하는 ​​MySQL 서버에서 실행될 쿼리를 작성하는 경우 다음을 수행 할 수 있습니다.

  • ANSI SQL로 모든 SQL 쿼리 작성
  • 다음과 같은 MySQL 특정 쿼리로 묶습니다.

    SET @OLD_SQL_MODE=@@SQL_MODE;
    SET SESSION SQL_MODE='ANSI';
    -- ANSI SQL queries
    SET SESSION SQL_MODE=@OLD_SQL_MODE;

이런 식으로 MySQL 전용 쿼리는 .sql 스크립트의 시작과 끝에 있습니다. 다른 서버용으로 배송 할 경우이 3 가지 쿼리를 제거하면됩니다. 더욱 편리하게 위의 모드 설정 쿼리를 포함하는 script_mysql.sql이라는 스크립트를 작성하고 script_ansi.sql 스크립트를 소싱하고 모드를 재설정 할 수 있습니다.


대단해! 쿼리를 한 번 작성하고 MySQL 스택을 전환 할 수 있습니다!
Ravemir
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.