programing

SQL 구문은 대소문자를 구분합니까?

linuxpc 2023. 7. 25. 20:42
반응형

SQL 구문은 대소문자를 구분합니까?

SQL 대/소문자를 구분합니까?대소문자를 구분하지 않는 MySQL과 SQL Server를 사용했습니다.항상 이런 건가요?표준은 대소문자 구분을 정의합니까?

SQL 키워드는 대소문자를 구분하지 않습니다(SELECT,FROM,WHERE등), 그러나 그것들은 종종 모든 대문자로 쓰여집니다.그러나 일부 설정에서는 테이블 및 열 이름이 대소문자를 구분합니다.

MySQL에는 활성화/비활성화를 위한 구성 옵션이 있습니다.일반적으로 Linux MySQL에서는 대/소문자를 구분하는 테이블 및 열 이름이 기본값이고 Windows에서는 대/소문자를 구분하지 않는 이름이 기본값이었지만 이제 설치 프로그램에서 이에 대해 물어 보았습니다.SQL Server의 경우 데이터베이스의 정렬 설정 기능입니다.

/소문자 구분에 대한 MySQL 페이지입니다.

다음은 SQL Server에 대한 데이터 정렬에 대한 MSDN의 기사입니다.

이것은 엄밀하게 SQL 언어는 아니지만 SQL Server에서 데이터베이스 모음이 대소문자를 구분하는 경우 모든 테이블 이름이 대소문자를 구분합니다.

SQL-92 사양에는 식별자가 따옴표로 묶이거나 따옴표로 묶이지 않을 수 있다고 명시되어 있습니다.양쪽이 모두 인용되지 않은 경우에는 항상 대소문자를 구분하지 않습니다. 예를 들어,table_name == TAble_nAmE.

그러나 인용된 식별자는 대소문자를 구분합니다."table_name" != "TAble_naME"또한 따옴표로 묶이지 않은 식별자를 따옴표로 묶지 않은 식별자와 따옴표로 묶지 않은 식별자를 따옴표로 묶지 않은 식별자와 따옴표로 묶지 않은 식별자를 같은 문자로 간주할 수 있습니다.TABLE_NAME == "TABLE_NAME",그렇지만TABLE_NAME != "table_name"또는TABLE_NAME != "TAble_NaMe".

다음은 사양의 관련 부분입니다(섹션 5.2.13).

  1. <정규 식별자>와 <정규 식별자>의 <식별자 본문>(해당하는 대문자 또는 문자로 대체된 모든 문자 포함) 및 <정규 식별자>의 <식별자 본문>이(모든 발생과 함께) 동일한 경우 <정규 식별자>와 <한정 식별자 본문>이 동일합니다<dll>이(가) <dll 기호>로 대체됨;SQL_TEXT의 <문자 집합 사양>을 지정하는 <문자열 리터럴>의 반복으로 간주되는 <doublequote symbol>로 대체된 <doublequote symbol>의 모든 발생 및 대소문자를 구분하는 구현 정의된 조합으로 간주되는 <문자열 리터럴>은 서브섹션 8의 비교 규칙에 따라 동일하게 비교됩니다.2,"<비교 술어>."

SQL 표준의 다른 부분과 마찬가지로 모든 데이터베이스가 이 섹션을 완전히 따르는 것은 아닙니다.포스트그레예를 들어 SQL은 따옴표로 묶이지 않은 모든 식별자를 대문자 대신 소문자로 저장합니다.table_name == "table_name"(정확히는 표준과 반대입니다.또한 일부 데이터베이스는 항상 대/소문자를 구분하지 않거나, 대/소문자를 구분하지 않거나, DB의 일부 설정에 따라 대/소문자를 구분하지 않거나, 일반적으로 파일 시스템이 대/소문자를 구분하는지 여부와 관계없이 시스템의 일부 속성에 따라 달라집니다.

일부 데이터베이스 도구는 항상 따옴표로 묶인 식별자를 보낼 수 있으므로, 일부 도구(예: Liquibase에서 생성된 CREATE TABLE 쿼리 또는 다른 DB 마이그레이션 도구)에서 생성된 쿼리를 직접 만든 쿼리(예: 응용 프로그램에서 간단한 JDBC 선택)와 혼합하는 경우에는 특히 대소문자가 일치하는지 확인해야 합니다.따옴표로 묶은 식별자와 따옴표로 묶지 않은 식별자가 서로 다른 n개의 데이터베이스(DB2, Postgre)SQL 등)

SQL Server에서는 옵션입니다.전원을 켜는 것은 최악입니다.

MySQL에 대해서는 잘 모르겠습니다.

많은 사람들이 예약 단어에는 대문자를 사용하고 식별자에는 대문자를 사용하는 관례를 따르지만 식별자와 예약 단어는 대소문자를 구분하지 않아야 합니다.

SQL-92 5.2항 참조

SQL 표준은 대소문자 구분이 필요한 것으로 알고 있습니다.하지만 어떤 데이터베이스도 표준을 완전히 따르지는 않는다고 생각합니다.

MySQL에는 대/소문자를 구분하거나 구분하지 않는 테이블 이름에 대한 "엄격 모드"(MySQL을 보다 표준 준수 상태로 만드는 여러 설정의 그래브백)의 일부로 구성 설정이 있습니다.이 설정에 관계없이 열 이름은 대소문자를 구분하지 않습니다. 열 이름이 표시되는 방식에 영향을 준다고 생각합니다.RDBMS 인스턴스 내의 모든 데이터베이스에 걸쳐 이 설정이 인스턴스 전체에 적용된다고 생각합니다. 오늘 이 설정을 확인하기 위해 조사 중입니다(답이 no이기를 바랍니다).

Oracle이 이 문제를 훨씬 더 잘 처리하는 방식이 마음에 듭니다.스트레이트 SQL에서 테이블 및 열 이름과 같은 식별자는 대소문자를 구분하지 않습니다.그러나 어떤 이유로 명시적 케이스를 사용하려는 경우 식별자를 이중 따옴표로 묶을 수 있습니다(Oracle SQL에서는 문자열 데이터를 묶는 데 사용되는 단일 따옴표와 상당히 다름).그래서:

SELECT fieldName
FROM tableName;

테이블 이름에서 필드 이름을 쿼리하지만

SELECT "fieldName"
FROM "tableName";

tableName에서 fieldName을 쿼리합니다.

이 메커니즘을 사용하여 식별자에 공백이나 다른 비표준 문자를 삽입할 수도 있다고 확신합니다.

이러한 상황에서 어떤 이유로 명확하게 대소문자가 구분된 표와 열 이름이 바람직하다고 판단되면 사용할 수 있지만 이는 여전히 매우 주의해야 할 사항입니다.

제가 오라클을 매일 사용할 때의 관례는 코드에서 모든 오라클 SQL 키워드를 대문자로, 모든 식별자를 소문자로 입력하는 것이었습니다.문서에서는 모든 표와 열 이름을 대문자로 표시합니다.이것을 할 수 있다는 것은 매우 편리하고 읽을 수 있었습니다. (비록 때때로 코드에 그렇게 많은 대문자를 입력하는 것이 고통스럽지만, 저는 제가 여기에서 도움이 될 편집자 기능을 찾을 수 있었을 것이라고 확신합니다.)

제 생각에 MySQL은 특히 플랫폼마다 이것에 대해 다르게 생각하기에 좋지 않습니다.Windows에 데이터베이스를 덤프하고 Unix에 로드할 수 있어야 합니다. Windows의 설치 관리자가 RDBMS를 대/소문자 구분 모드로 전환하는 것을 잊어버린 경우 이러한 작업은 큰 문제가 됩니다. (솔직히 말해서, 이것이 문제가 되는 이유의 일부는 오래 전에 우리 코더들이 UNIX에 있는 MySQL의 대/소문자 구분에 의존하는 잘못된 결정을 내렸기 때문입니다.)Windows MySQL 설치 프로그램을 작성한 사람들은 이를 매우 편리하고 Windows와 유사하게 만들었으며, 사람들에게 "엄격 모드를 설정하고 MySQL을 더 표준 준수 상태로 만들겠습니까?"라는 확인란을 제공할 수 있는 방향으로 나아가는 것이 좋았습니다.그러나 MySQL은 표준과 매우 크게 다른 다음 서로 다른 플랫폼에서 자체 표준과 다른 방식으로 전환하여 문제를 악화시키는 것이 매우 편리합니다.각기 다른 Linux 배포판에서는 서로 다른 배포판의 패키지 관리자가 때때로 선호하는 MySQL 구성 설정을 통합했기 때문에 이 문제가 더욱 복잡해질 수 있다고 확신합니다.

RDBMS에서 대/소문자 구분이 바람직한지 논의하는 또 다른 스택 오버플로 질문이 있습니다.

아니요. MySQL은 대소문자를 구분하지 않으며 SQL 표준도 마찬가지입니다.명령어는 대문자로 쓰는 것이 일반적입니다.

테이블/열 이름에 대해서는 명령 자체는 아니지만, 예를 들어 테이블/열 이름에 대해서는 설명합니다.

그렇게

SELECT * FROM foo;

와 동일합니다.

select * from foo;

하지만 와 같지는 않습니다.

select * from FOO;

저는 이 블로그 게시물이 매우 도움이 된다는 것을 알았습니다(저는 작성자가 아닙니다).요약(단, 읽어보시기 바랍니다.

...따옴표로 묶지 않은 식별자는 대소문자를 구분하며("table_name"!= "Table_Name"), 따옴표로 묶지 않은 식별자는 대소문자를 구분하지 않으며 대문자(table_name=> TAB)로 변환됩니다.LE_NAME).

그는 DB2, Oracle 및 Interbase/Firebird가 100% 호환된다는 것을 알게 되었습니다.

PostgreSQL...소문자를 대문자로 쓰는 대신 따옴표로 묶지 않은 모든 식별자를 대소문자로 구분합니다.MySQL... 파일 시스템에 종속되어 있습니다.테이블 및 필드 이름의 SQLite 및 SQL Server ... 대소문자는 생성 시 보존되지만 이후에는 완전히 무시됩니다.

SQL Server는 대소문자를 구분하지 않습니다. 적어도 기본적으로는 그렇지 않습니다.

SQL Server Management Studio를 통해 수동으로 쿼리할 때 항상 케이스를 엉망으로 만들고 흔쾌히 수락합니다.

select cOL1, col2 FrOM taBLeName WheRE ...

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

테이블, 열 등의 이름은 데이터베이스에 따라 대소문자를 구분합니다. 대소문자를 구분하지 않는 한 대소문자를 구분한다고 가정해야 합니다. 많은 데이터베이스에서는 대소문자를 구분하지 않습니다. MySQL 테이블 이름은 대소문자를 구분하지 않지만 대부분의 다른 이름은 대소문자를 구분하지 않습니다.

=, >, < 등을 사용하여 데이터를 비교하면 문제의 개별 데이터베이스, 테이블 또는 열에서 사용 중인 데이터 정렬 설정에 따라 사례 인식이 달라집니다.그러나 데이터베이스 내에서 일관성 있는 데이터 정렬을 유지하는 것이 일반적입니다.대소문자를 구분하는 값을 저장해야 하는 몇 개의 열이 있습니다. 열에는 특별히 설정된 조합이 있습니다.

두 가지 장점을 모두 누리십시오.

요즘에는 모든 SQL 문을 소문자로 작성하고 포맷이 필요한 경우 플러그인을 설치하면 됩니다.코드 편집기에 이러한 플러그인을 사용할 수 있는 경우에만 적용됩니다.Visual Studio Code에는 이를 수행할 수 있는 많은 확장자가 있습니다.

다음과 같은 몇 가지 방법을 사용할 수 있습니다. vscode-sql-formatter 및 SqlFormatter-VScode

언급URL : https://stackoverflow.com/questions/153944/is-sql-syntax-case-sensitive

반응형