раскрываем магию my sql или о строгости и мягкости mysql
DESCRIPTION
Video: http://youtu.be/ee5mbBbkW4UTRANSCRIPT
Раскрываем магию MySQLили
о строгости и мягкости MySQL
Видеозапись http://youtu.be/ee5mbBbkW4U
Три типичные ошибки
разработчика БД MySQL
Пример 1
???
Тип Байт Мин. Макс.[SIGNED] TINYINT 1 -128 127
UNSIGNED TINYINT 1 0 255
[SIGNED] SMALLINT 2 -32768 32767
UNSIGNED SMALLINT 2 0 65535
[SIGNED] MEDIUMINT 3 -8388608 8388607
UNSIGNED MEDIUMINT 3 0 16777215
[SIGNED] INT 4 -2147483648 2147483647
UNSIGNED INT 4 0 4294967295
[SIGNED] BIGINT 8 -9223372036854775808 9223372036854775807
UNSIGNED BIGINT 8 0 18446744073709551615
BIGINTВалидация на стороне БД,но …
VARCHAR(10)Валидация на сторонеязыка программирования
Пример 2
???
Пример 3
???
Основные промышленные реляционные базы данных
SQL mode
Внимание! Не пытайтесь на боевом сервере менять значение SQL mode.
Смена режима SQL mode после создания и вставки данных в таблицы типа «partition» может привести к потере или повреждению данных!
При репликации партиционных таблиц, отличающиеся параметры SQL mode на Primary и Slave MySQL серверах также может привести к проблемам. Для стабильной работы репликации между серверами, настройки SQL mode должны быть идентичными.
SQL modes – это настройка поведения работы сервера MySQL, состоящая из режимов, каждый из которых контролирует какой-либо один аспект обработки запроса.
1. Устанавливает строгую или мягкую проверку входных данных2. Включает или отключает следование SQL стандарту3. Обеспечивает лучшую синтаксическую совместимость с другими БД
Глобальная настройка для всего сервера
Настройка для текущей сессии
Изменение режима
Краткий справочник режимов
ANSI_QUOTES
Заставляет сервер интерпретировать двойную кавычку ( " ) точно также, как и обратную кавычку ( ` ), при этом она теряет способность обрамлять строки.
IGNORE_SPACE
Заставляет сервер игнорировать пробелы между именем функции и скобкой, что позволяет устанавливать пробелы между названием функции и открывающейся скобкой. При этом имена всех функций становятся зарезервированными.
ERROR_FOR_DIVISION_BY_ZERO
При делении на ноль в строгом режиме генерируется ошибка (или предупреждение, если не включён строгий режим) во время выполнения операторов INSERT и UPDATE. Без этого параметра деление на ноль возвращает предупреждение и вставляет в таблицу NULL.
STRICT_TRANS_TABLES
Включает «строгий режим» для всех баз данных, поддерживающих транзакции (InnoDB и BDB).
Включение строгого режима генерирует ошибку вместо предупреждения!
Строгость распространяется на:
1. Поверка входных данных на соответствие заданному типу
2. Нахождение внутри диапазона для чисел и дат3. При вставке данных пропущено значение колонки,
для которой не задано значение по умолчанию и имеет атрибут NOT NULL
4. Длина значения выходит за пределы заданного диапазона
5. Для типов ENUM и SET отсутствует вставляемое или обновляемое значение
STRICT_ALL_TABLES
STRICT_ALL_TABLES полностью соответствует STRICT_TRANS_TABLES, но действие параметра уже распространяется на все виды баз данных MySQL, а не только на те, которые поддерживают транзакции.
Из-за разницы подходов к работе транзакционных и не транзакционных таблиц не всегда есть смысл использовать данный режим.
TRADITIONAL
Заставляет MySQL вести себя как большинство «традиционных» баз данных SQL.
Данный режим является композитным режимом, включающий в себя «строгий режим», а также ряд других режимов.
ANSI
Композитный режим, заставляет MySQL быть «ANSI-подобным», т.е. приближенным к стандарту SQL.
Включает в себя: REAL_AS_FLOAT, PIPES_AS_CONCAT, ANSI_QUOTES, IGNORE_SPACE.
REAL_AS_FLOAT – тип данных real является синонимом float, а не double.PIPES_AS_CONCAT – разрешает использовать для конкатенации строк | | , вместо логического ИЛИ.
ONLY_FULL_GROUP_BY
Генерирует ошибку в запросах, в которых GROUP BY имеет не полный список не агрегированных параметров из SELECT и HAVING.
Строгий режим
• Возвращает ошибку.• Для транзакционных таблиц откатывает транзакцию
(rollback).Для не транзакционных таблиц отменяет изменение в таблице.
Следует учесть, что в не транзакционных таблицах при изменении сразу нескольких строк, в случае ошибки отменяется только последнее значение, вместо отката всех параметров.
Генерирует ошибку в следующих случаях:• Тип вставляемых данных отличается от заданного
типа данных• Пропуск значения в столбце, у которого нет значения
по умолчанию и задан параметр NOT NULL.• Для чисел и дат – данные находятся вне диапазона
допустимых значений.• Для строк – превышение допустимой длины.• Для типа ENUM и SET – значение не является
допустимым для заданного перечисления.• Для столбца определённого как NOT NULL - вставка
NULL.
Дефолтные значения для типов данных
Порядок обработки данных
1. Если столбец имеет значение по умолчанию, то используется это значение и на этом всё заканчивается, в противном случае происходит переход к следующему шагу
2. Если столбец не имеет параметр NOT NULL, то присваивается NULL и на этом всё заканчивается, в противном случае поведение зависит от переменной sql_mode, точнее от строгости самого режима.
В строгом режиме генерируется ошибка.
Значения по умолчанию для разных типов данных
В нестрогом режиме происходит неявное преобразование в дефолтное значение типа данных:
• Для типа int значение по умолчанию - ноль.• Для всех строк, кроме типа enum – пустая строка.• Для enum – первый нумерованный член.• Для даты и времени – нулевые значения
'0000-00-00 00:00:00‘• Для timestamp — текущая дата и время, если колонка
была автоматически инициализирована, либо нулевыми значениями '0000-00-00 00:00:00'
Нестрогий режим
Случаи обработки некорректных данных
• Запросы на модификация данных: INSERT, UPDATE, REPLACE или LOAD DATA INFILE.
• Обновление описания схем таблиц: ALTER TABLE.
• Задание значения по умолчанию (DEFAULT) в описании колонок.
В нестрогом режиме значение приводится к корректному значению и генерируется предупреждение.
Для просмотра ошибок используйте SHOW WARNINGS.
Выход из диапазона допустимых значений
Если число меньше минимального значения допустимого диапазона, то присваивается минимально-допустимое число. Если больше максимального – максимально-допустимое.
Обработка строк
Строки длиннее заданной длины колонки усекаются.
ENUM и SET типы данных
Если присваиваемое значение колонке с типом ENUM не перечислено в определении ENUM, то MySQL преобразует его в пустую строку.
Если значение, которое присваивается SET столбцу содержит элементы, которые не перечислены в определении SET, то MySQL отбрасывает эти элементы, сохраняя значения только легальным элементам.
Преобразование в тип даты
При попытке сохранения значения, которое не может быть преобразовано в тип данных столбца, MySQL неявно преобразует его в значение по умолчанию для данного типа.
Таблица преобразований
String DATE INT
'2010-03-12' '2010-03-12' 2010
'03-12-2010' '0000-00-00' 3
'0017' '0000-00-00' 17
'500 hats' '0000-00-00' 500
'bartholomew' '0000-00-00' 0
Присвоение NULLдля колонки с NOT NULL
Результат зависит от того, будет вставлена одна строка или множество в INSERT запрос.
При вставке одной строки возникает ошибка и изменения не применяются. При множественной вставке - MySQL неявно преобразует значение по умолчанию для этого типа данных.
ALTER TABLE
При изменении типа данных на колонку налагаются ограничения нового типа, что может привести к неожиданному изменению самих данных.
Если на колонку налагается ограничение NOT NULL, то все NULL значения конвертируются в значения по умолчанию для заданного типа данных текущей колонки.
Извлекаем плюсы
Ключевое слово IGNORE
Ключевое слово IGNORE заставляет MySQL использовать нестрогий режим для запроса. Также используется для генерации предупреждения вместо ошибки, при нарушении целостности первичного ключа (PRIMARY KEY) или уникальности (UNIQUE).
ON DUPLICATE KEY UPDATE
Используется для выполнения вставки данных, либо при их обновлении и нарушении целостности первичного ключа (PRIMARY KEY) или уникальности (UNIQUE).
ВОПРОСЫ?