복붙노트

[SQL] SQL 구문의 경우 민감한인가?

SQL

SQL 구문의 경우 민감한인가?

민감한 SQL 케이스입니다. 나는 모두에 민감한 사건을 것 같다 MySQL과 SQL 서버를 사용했습니다. 항상 그런가요? 표준은 대소 문자 구분을 정의 하는가?

해결법

  1. ==============================

    1.는 SQL 키워드 (등, WHERE, FROM, 선택) 대소 문자를 구분하지만 종종 모두 대문자로 작성됩니다. 그러나 일부 설정에 테이블과 컬럼 이름은 대소 문자를 구분합니다. MySQL은 활성화 / 비활성화를 구성 옵션이 있습니다. 일반적으로 대소 문자를 구분 테이블 및 열 이름은 설치 프로그램이 설치하는 동안이에 대한 질문 이제 리눅스의 MySQL에 기본 및 Windows에서 기본으로 사용되는 대소 문자를 구분하지만입니다. MSSQL의 경우는 데이터베이스의 데이터 정렬 설정의 함수이다.

    는 SQL 키워드 (등, WHERE, FROM, 선택) 대소 문자를 구분하지만 종종 모두 대문자로 작성됩니다. 그러나 일부 설정에 테이블과 컬럼 이름은 대소 문자를 구분합니다. MySQL은 활성화 / 비활성화를 구성 옵션이 있습니다. 일반적으로 대소 문자를 구분 테이블 및 열 이름은 설치 프로그램이 설치하는 동안이에 대한 질문 이제 리눅스의 MySQL에 기본 및 Windows에서 기본으로 사용되는 대소 문자를 구분하지만입니다. MSSQL의 경우는 데이터베이스의 데이터 정렬 설정의 함수이다.

    여기에 이름 대소 문자 구분에 대한 MySQL의 페이지입니다

    여기에 MSSQL에 대한 데이터 정렬에 대한 MSDN에있는 문서입니다

  2. ==============================

    2.이것은 엄격하게 SQL 언어가 아니라 SQL Server의 데이터베이스 데이터 정렬은 대소 문자를 구분하는 경우, 모든 테이블 이름은 대소 문자를 구분합니다.

    이것은 엄격하게 SQL 언어가 아니라 SQL Server의 데이터베이스 데이터 정렬은 대소 문자를 구분하는 경우, 모든 테이블 이름은 대소 문자를 구분합니다.

  3. ==============================

    3.는 SQL 서버는 옵션입니다. 를 켜면 안됐다.

    는 SQL 서버는 옵션입니다. 를 켜면 안됐다.

    나는 MySQL은 확실하지 않다.

  4. ==============================

    4.많은 후속 대회가 예약어와 식별자에 대한 파스칼 경우에 수도를 사용하지만 식별자와 예약어는 대소 문자를 구분해서는 안됩니다.

    많은 후속 대회가 예약어와 식별자에 대한 파스칼 경우에 수도를 사용하지만 식별자와 예약어는 대소 문자를 구분해서는 안됩니다.

    SQL-92 절을 참조하십시오. 5.2

  5. ==============================

    5.SQL92 사양 상태는 식별자를 인용, 또는 인용 부호가 될 수있다. 양측은 다음 인용 부호로 둘러싸이지 않은 경우 그들은 항상 예를 ​​들어, 대소 문자를 구별이다 테이블 _ == TABLE_NAME.

    SQL92 사양 상태는 식별자를 인용, 또는 인용 부호가 될 수있다. 양측은 다음 인용 부호로 둘러싸이지 않은 경우 그들은 항상 예를 ​​들어, 대소 문자를 구별이다 테이블 _ == TABLE_NAME.

    그러나 인용 식별자는, 예를 들어 대소 문자를 구분 "TABLE_NAME"! = "TABLE_NAME". 또한 인용 사람과 unqouted 식별자를 비교하고자하는 경우 사양에 따라, 다음 인용되지 않은 및 인용 식별자로 간주 될 수 같은, 인용 부호로 둘러싸이지 않은 문자를 대문자로하는 경우, 예를 들어, TABLE_NAME == "TABLE_NAME"하지만, TABLE_NAME! = "테이블 _"또는 TABLE_NAME! = "TABLE_NAME".

    여기서 스펙 (섹션 5.2.13)의 중요한 부분이다 :

         13)A <regular identifier> and a <delimited identifier> are equiva-
            lent if the <identifier body> of the <regular identifier> (with
            every letter that is a lower-case letter replaced by the equiva-
            lent upper-case letter or letters) and the <delimited identifier
            body> of the <delimited identifier> (with all occurrences of
            <quote> replaced by <quote symbol> and all occurrences of <dou-
            blequote symbol> replaced by <double quote>), considered as
            the repetition of a <character string literal> that specifies a
            <character set specification> of SQL_TEXT and an implementation-
            defined collation that is sensitive to case, compare equally
            according to the comparison rules in Subclause 8.2, "<comparison
            predicate>".
    

    단지 SQL 표준의 다른 부분과 마찬가지로, 모든 데이터베이스가 완전하게이 부분을 따라 주. PostgreSQL는 예컨대 저장 인용되지 않은 모든 식별자는 대문자 소문자 대신 때문에 (정확하게 표준의 반대측) TABLE_NAME == "테이블 _". 또한 일부 데이터베이스는 항상 대소 문자를 구분, 또는 대소 민감성은 DB에서 일부 설정에 따라 또는 파일 시스템은 대소 문자를 구분 여부 보통 여부, 시스템의 일부 특성에 따라 달라집니다.

    간단한 JDBC를 선택 같은 일부 데이터베이스 도구 식별자를 보낼 수 있음을 참고 (손으로 만든 쿼리, 그래서 당신은 (Liquibase 또는 다른 DB 마이그레이션 도구에 의해 생성 된 CREATE TABLE 쿼리 같은) 일부 도구에 의해 생성 된 쿼리를 섞어 경우에, 모든 시간을 인용 ) 응용 프로그램에서 당신은 경우 특히 인용 인용되지 않은 식별자가 다른 (DB2, PostgreSQL을, 등)에있는 데이터베이스에 일관성이 있는지 확인해야합니다

  6. ==============================

    6.나의 이해는 대소 문자를 구분 사용에 대한 SQL 표준 호출하는. 나는 어떤 데이터베이스가 있지만, 완전하게 표준을 따르 생각하지 않는다.

    나의 이해는 대소 문자를 구분 사용에 대한 SQL 표준 호출하는. 나는 어떤 데이터베이스가 있지만, 완전하게 표준을 따르 생각하지 않는다.

    MySQL은 그 "엄격 모드"대소 문자를 구분하거나 구분하지 테이블 이름 (MySQL을보다 표준 규격을 몇 가지 설정의 복 주머니)의 일부로 구성 설정이 있습니다. 나는 그것이 열 이름이 표시되는 방법에 영향을 생각하지만이 설정에 관계없이, 열 이름은 여전히 ​​대소 문자를 구별하지 않는다. 나는이 문제를 확인하기 위해 오늘 연구 (그리고 대답은 더 바라고 없음)하고있어 비록 나는,이 설정은 RDBMS 인스턴스 내의 모든 데이터베이스에서, 인스턴스 넓은 생각합니다.

    나는 오라클이 훨씬 더이 문제를 처리하는 방법을 좋아한다. 바로 SQL에서 테이블 및 열 이름과 같은 식별자의 경우를 구분하지 않습니다. 어떤 이유로 당신이 정말로 명시 적으로 케이스를 얻기 위해 원하는 경우, 당신은 (묶으 문자열 데이터에 사용되는 작은 따옴표에서 오라클 SQL에서 확실히 다르다) 큰 따옴표 식별자를 동봉 할 수 있습니다. 그래서:

    SELECT fieldName
    FROM tableName;
    

    , TABLENAME에서 필드 이름을 쿼리하지만

    SELECT "fieldName"
    FROM "tableName";
    

    TABLENAME에서 fieldName은 쿼리합니다.

    나는 확신 당신도 식별자에 공백이나 기타 비표준 문자를 삽입이 메커니즘을 사용할 수 있어요.

    어떤 이유로 당신이 당신에게 사용할 수있었습니다 명시 적으로-맡았다 테이블 및 열 이름이 바람직 발견,하지만 여전히 내가보기 엔에 대해주의 할 것이 있다면이 상황에서.

    나는 매일 오라클을 사용하여 내 규칙은 코드에서 나는 소문자 대문자로 모든 Oracle SQL 키워드와 모든 식별자를 넣어 것이라고했다. 문서에서 나는 대문자로 모든 테이블 및 열 이름을 둘 것입니다. 이 작업을 수행 할 수 매우 편리하고 읽을 수 있었다 (때로는 통증이 코드에서 너무 많은 자본을 입력 할 수 있지만 - 나는 확실히 내가 여기에 도움을 편집기 기능을 발견했습니다 수 있어요).

    내 의견으로는 MySQL은 다른 플랫폼에 대해 서로 다른 특히 나쁘다. 우리는 UNIX에 Windows에서 데이터베이스를 덤프하고로드 할 수 있어야합니다 및 Windows에서 설치는 대소 문자를 구분 모드로 RDBMS를 넣어 잊어 버린 경우 이렇게하면 재앙이다. (이 재앙 이유의 일부는 우리의 코더가 UNIX에서 MySQL의 경우 감도에 의존 오래 전에 나쁜 결정을, 만들어, 공정하게.) 윈도우 MySQL의 설치를 쓴 사람들이 정말 편리하게 만들어 윈도우와 같은, 그것은 사람들에게 말할 수있는 체크 박스를주는 방향으로 이동 좋았어요 "겠습니까 당신이 엄격 모드를 켜고 MySQL을 더 표준을 준수하기 위해 좋아하세요?" MySQL은 턴어라운드와 다른 플랫폼에 자신의 사실상의 표준에서 다른에 의해 설상가상으로 다음 표준에서 너무 해지고, 다르며,하는 그러나 그것은 매우 편리합니다. 다른 배포판에 대한 배포자 아마 시간이 자신의 선호하는 MySQL의 구성 설정을 통합에 가지고 나는 확실히 다른 리눅스 배포판이 더 악화 될 수 있어요.

    여기에 대소 문자 구분이 RDBMS에서 바람직 경우 논의에 들어간 다른 SO 질문입니다.

  7. ==============================

    7.제 MySQL은 대소 문자를 구분하지 않으며, 어느 쪽도 SQL 표준입니다. 이 명령을 대문자를 작성하는 단지 일반적인 관행입니다.

    제 MySQL은 대소 문자를 구분하지 않으며, 어느 쪽도 SQL 표준입니다. 이 명령을 대문자를 작성하는 단지 일반적인 관행입니다.

    당신이 테이블 / 열 이름에 대해 이야기하는 경우 이제, 다음 네 그들은,하지만하지 명령 자체.

    그래서

    SELECT * FROM foo;
    

    와 같다

    select * from foo;
    

    하지만 동일하지

    select * from FOO;
    
  8. ==============================

    8.나는이 블로그 게시물 (나는 저자 아닙니다) 매우 도움이 될 것으로. (하지만, 읽어 보시기 바랍니다) 요약 :

    나는이 블로그 게시물 (나는 저자 아닙니다) 매우 도움이 될 것으로. (하지만, 읽어 보시기 바랍니다) 요약 :

    그는 DB2, Oracle 및 인터베이스 / 파이어 버드 100 % 준수 발견 :

  9. ==============================

    9.나는 적어도 기본적으로 SQL 서버는 대소 문자를 구분 생각하지 않습니다.

    나는 적어도 기본적으로 SQL 서버는 대소 문자를 구분 생각하지 않습니다.

    내가 관리 Studio, 경우 최대 I 엉망 모든 시간을 통해 수동으로 쿼리하고있을 때 그것은 유쾌을 받아 들인다 :

    select cOL1, col2 FrOM taBLeName WheRE ...
    
  10. ==============================

    10.SQL 키워드는 스스로 대소 문자를 구분하지 않습니다.

    SQL 키워드는 스스로 대소 문자를 구분하지 않습니다.

    테이블의 이름은, 열 등 의존하는 데이터베이스 인 경우 감도가 - 당신은 아마 그들은 당신이 그렇지 않으면 알지 못한다면 대소 문자를 구분한다고 가정한다 (많은 데이터베이스에서 그들은는 아니지만, 테이블 이름은 가끔 대소 문자를 구분하지만, 대부분의 다른 있습니다 MySQL의에 이름은) 없습니다.

    사용하여 데이터를 비교 =,>, <등, 문제의 개별 데이터베이스, 테이블 또는 열에서 사용중인 데이터 정렬 설정에 의존하는 경우 인식을 가지고있다. 그것은 데이터베이스 내에서 상당히 일관성있는 데이터 정렬을 유지하기 위해, 그러나 정상입니다. 우리는 대소 문자를 구분 값을 저장해야 할 몇 가지 열이; 그들은 정렬 구체적으로 설정해야합니다.

  11. from https://stackoverflow.com/questions/153944/is-sql-syntax-case-sensitive by cc-by-sa and MIT license