Является ли регистр синтаксиса SQL чувствительным?

Учитывается регистр SQL. Я использовал MySQL и SQL Server, которые кажутся случайными. Это всегда так? Стандарт определяет чувствительность к регистру?

Ответ 1

Ключевые слова SQL не чувствительны к регистру (SELECT, FROM, WHERE и т.д.), но часто записываются во всех кепках. Однако в некоторых настройках имена таблиц и столбцов чувствительны к регистру. У MySQL есть опция конфигурации для включения/выключения. Обычно регистрозависимые имена таблиц и столбцов являются стандартными для Linux MySQL и без учета регистра, которые по умолчанию используются в Windows, но теперь установщик спросил об этом во время установки. Для MSSQL это функция настройки сортировки базы данных.

Вот страница MySQL о чувствительности к регистру по умолчанию

Вот статья в MSDN о сопоставлениях для MSSQL

Ответ 2

Это не строго язык SQL, но в SQL Server, если сортировка базы данных чувствительна к регистру, все имена таблиц чувствительны к регистру.

Ответ 3

Идентификаторы и зарезервированные слова не должны быть чувствительны к регистру, хотя многие из них следуют за соглашением использовать кавычки для зарезервированных слов и случай Паскаля для идентификаторов.

См. SQL-92 Раздел. 5.2

Ответ 4

В Sql Server это вариант. Включение его в отстой.

Я не уверен в MySql.

Ответ 5

Я понимаю, что стандарт SQL требует нечувствительности к регистру. Я не считаю, что базы данных полностью соответствуют стандарту.

У MySQL есть параметр конфигурации как часть его "строгого режима" (сумка для захвата нескольких параметров, которые делают MySQL более совместимым с стандартами) для регистрозависимых или нечувствительных имен таблиц. Независимо от этого параметра, имена столбцов по-прежнему нечувствительны к регистру, хотя я думаю, что это влияет на отображение имен столбцов. Я считаю, что этот параметр является экземпляром для всех баз данных в экземпляре RDBMS, хотя сегодня я исследую это, чтобы подтвердить это (и надеюсь, что ответ будет отрицательным).

Мне нравится, как Oracle справляется с этим намного лучше. В прямом SQL идентификаторы, такие как имена таблиц и столбцов, нечувствительны к регистру. Однако, если по какой-то причине вы действительно хотите получить явный корпус, вы можете заключить идентификатор в двойные кавычки (которые в Oracle SQL отличаются от одиночных кавычек, используемых для вложения строковых данных). Итак:

SELECT fieldName
FROM tableName;

запросит имя поля из tablename, но

SELECT "fieldName"
FROM "tableName";

запросит имя поля из tableName.

Я уверен, что вы даже можете использовать этот механизм для вставки пробелов или других нестандартных символов в идентификатор.

В этой ситуации, если по какой-то причине вы нашли желаемые имена столбцов и столбцов с явным образом, которые были доступны вам, но это было все еще что-то, о чем я мог бы предостеречь.

Моя конвенция, когда я ежедневно применяла Oracle, заключалась в том, что в коде я бы поставил все ключевые слова Oracle SQL в верхнем регистре и все идентификаторы в нижнем регистре. В документации я бы поместил все имена таблиц и столбцов в верхний регистр. Это было очень удобно и удобочитаемо, чтобы иметь возможность сделать это (хотя иногда и боль, чтобы напечатать так много столиц в коде - я уверен, что я мог бы найти функцию редактора, чтобы помочь здесь).

По-моему, MySQL особенно плох, потому что отличается от этого на разных платформах. Нам нужно иметь возможность удалять базы данных в Windows и загружать их в UNIX, и это катастрофа, если установщик в Windows забыл включить RDBMS в режим, чувствительный к регистру. (Чтобы быть справедливым, часть причины, по которой это катастрофа, - это то, что наши кодеры давно уже ошибочно полагались на чувствительность к регистру MySQL в UNIX.) Люди, которые написали установщик Windows MySQL, сделали это очень удобным и Windows-like, и было здорово продвигаться к тому, чтобы дать людям чекбокс, чтобы сказать: "Хочешь включить строгий режим и сделать MySQL более стандартным?" Но MySQL очень удобен в том, что он отличается от стандарта стандартным, а затем ухудшается, оборачиваясь и отличаясь от своего собственного стандарта де-факто на разных платформах. Я уверен, что в разных дистрибутивах Linux это может быть еще более усугублено, так как упаковщики для разных дистрибутивов, по-видимому, иногда использовали свои собственные настройки конфигурации MySQL.

Here другой вопрос SO, который обсуждает, нужна ли чувствительность к регистру в РСУБД.

Ответ 6

спецификация SQL92 утверждает, что идентификаторы могут быть указаны или не кавычки. Если обе стороны не сортируются, то они всегда чувствительны к регистру, например. table_name == TAble_nAmE.

Однако цитируемые идентификаторы чувствительны к регистру, например. "table_name" != "TAble_naME". Также, основываясь на спецификации, если вы хотите сравнить неотображаемые идентификаторы с цитируемыми, то идентификаторы без кавычек и кавычек могут считаться одинаковыми, если неуказанные символы в верхнем регистре, например. TABLE_NAME == "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, например, хранит все некотируемые идентификаторы с нижним регистром вместо uppercased, поэтому TABLE_NAME == "TABLE_NAME" (что точно соответствует стандарту). Кроме того, некоторые базы данных нечувствительны к регистру все время, или чувствительность к регистру зависит от некоторых параметров в БД или зависит от некоторых свойств системы, как правило, зависит от того, является ли файловая система чувствительной к регистру или нет.

Обратите внимание, что некоторые инструменты базы данных могут отправлять теги, которые котируются все время, поэтому в случаях, когда вы смешиваете запросы, сгенерированные каким-то инструментом (например, запрос CREATE TABLE, созданный Liquibase или другим инструментом миграции базы данных), с запросами вручную (например, просто выберите JDBC в своем приложении), вы должны убедиться, что дела совместимы, особенно в базах данных, где котируемые и некотируемые идентификаторы отличаются (DB2, PostgreSQL и т.д.).

Ответ 7

Я нашел этот пост в блоге, чтобы быть очень полезным (я не автор). Подведение итогов (пожалуйста, прочитайте, хотя):

... идентификаторы с разделителями чувствительны к регистру ( "table_name"!= "Table_Name" ), в то время как идентификаторы без кавычек не являются и преобразуются в верхний регистр (table_name = > TABLE_NAME).

Он обнаружил, что DB2, Oracle и Interbase/Firebird соответствуют 100%:

PostgreSQL... управляет каждым некотируемым идентификатором, а не верхним. MySQL... зависит от файловой системы. SQLite и SQL Server... случай имен таблиц и полей сохраняется при создании, но после этого они полностью игнорируются.

Ответ 8

Нет. MySQL не чувствителен к регистру, и ни один из них не является стандартом SQL. Это просто обычная практика написания команд в верхнем регистре.

Теперь, если вы говорите о именах таблиц и столбцов, то да, они есть, но не сами команды.

Итак,

SELECT * FROM foo;

совпадает с

SELECT * FROM foo;

но не совпадает с

SELECT * FROM foo;

Ответ 9

SQL-ключевые слова сами по себе нечувствительны к регистру.

Имена таблиц, столбцов и т.д. имеют чувствительность к регистру, зависящую от базы данных. Вероятно, вы должны предположить, что они чувствительны к регистру, если вы не знаете иначе (во многих базах данных их нет, а в именах таблиц MySQL - SOMETIMES с учетом регистра но большинство других имен нет).

Сравнение данных с использованием =, > , < и т.д., имеет информацию о случаях, которая зависит от настроек сортировки, которые используются в отдельной базе данных, таблице или столбце, о котором идет речь. Тем не менее, это нормально, чтобы держать сопоставление достаточно согласованным в базе данных. У нас есть несколько столбцов, которые должны хранить значения, чувствительные к регистру; они имеют определенную сортировку.

Ответ 10

Я не думаю, что SQL Server чувствителен к регистру, по крайней мере, не по умолчанию.

Когда я запрашиваю вручную через Management Studio, я все время исповедую дело, и он с готовностью принимает его:

select cOL1, col2 FrOM taBLeName WheRE ...