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

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



답변

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 예약어 )


답변

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

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;


답변

다른 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 스크립트를 소싱하고 모드를 재설정 할 수 있습니다.


답변