раскрываем магию my sql или о строгости и мягкости mysql

57
Раскрываем магию MySQL или о строгости и мягкости MySQL Видеозапись http://youtu.be/ee5mbBbkW4U

Upload: yuri-afanasiev

Post on 16-Jun-2015

640 views

Category:

Documents


7 download

DESCRIPTION

Video: http://youtu.be/ee5mbBbkW4U

TRANSCRIPT

Page 1: раскрываем магию My sql или о строгости и мягкости mysql

Раскрываем магию MySQLили

о строгости и мягкости MySQL

Видеозапись http://youtu.be/ee5mbBbkW4U

Page 2: раскрываем магию My sql или о строгости и мягкости mysql

Компании

Сертификаты

E-mail: [email protected]

Афанасьев Юрий

Page 3: раскрываем магию My sql или о строгости и мягкости mysql

Три типичные ошибки

разработчика БД MySQL

Page 4: раскрываем магию My sql или о строгости и мягкости mysql

Пример 1

Page 5: раскрываем магию My sql или о строгости и мягкости mysql

???

Page 6: раскрываем магию My sql или о строгости и мягкости mysql
Page 7: раскрываем магию My sql или о строгости и мягкости mysql

Тип Байт Мин. Макс.[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

Page 8: раскрываем магию My sql или о строгости и мягкости mysql

BIGINTВалидация на стороне БД,но …

VARCHAR(10)Валидация на сторонеязыка программирования

Page 9: раскрываем магию My sql или о строгости и мягкости mysql

Пример 2

Page 10: раскрываем магию My sql или о строгости и мягкости mysql

???

Page 11: раскрываем магию My sql или о строгости и мягкости mysql
Page 12: раскрываем магию My sql или о строгости и мягкости mysql

Пример 3

Page 13: раскрываем магию My sql или о строгости и мягкости mysql

???

Page 14: раскрываем магию My sql или о строгости и мягкости mysql
Page 15: раскрываем магию My sql или о строгости и мягкости mysql

Основные промышленные реляционные базы данных

Page 16: раскрываем магию My sql или о строгости и мягкости mysql

SQL mode

Page 17: раскрываем магию My sql или о строгости и мягкости mysql

Внимание! Не пытайтесь на боевом сервере менять значение SQL mode.

Смена режима SQL mode после создания и вставки данных в таблицы типа «partition» может привести к потере или повреждению данных!

При репликации партиционных таблиц, отличающиеся параметры SQL mode на Primary и Slave MySQL серверах также может привести к проблемам. Для стабильной работы репликации между серверами, настройки SQL mode должны быть идентичными.

Page 18: раскрываем магию My sql или о строгости и мягкости mysql

SQL modes – это настройка поведения работы сервера MySQL, состоящая из режимов, каждый из которых контролирует какой-либо один аспект обработки запроса.

1. Устанавливает строгую или мягкую проверку входных данных2. Включает или отключает следование SQL стандарту3. Обеспечивает лучшую синтаксическую совместимость с другими БД

Page 19: раскрываем магию My sql или о строгости и мягкости mysql

Глобальная настройка для всего сервера

Настройка для текущей сессии

Изменение режима

Page 20: раскрываем магию My sql или о строгости и мягкости mysql

Краткий справочник режимов

Page 21: раскрываем магию My sql или о строгости и мягкости mysql

ANSI_QUOTES

Заставляет сервер интерпретировать двойную кавычку ( " ) точно также, как и обратную кавычку ( ` ), при этом она теряет способность обрамлять строки.

Page 22: раскрываем магию My sql или о строгости и мягкости mysql

IGNORE_SPACE

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

Page 23: раскрываем магию My sql или о строгости и мягкости mysql

ERROR_FOR_DIVISION_BY_ZERO

При делении на ноль в строгом режиме генерируется ошибка (или предупреждение, если не включён строгий режим) во время выполнения операторов INSERT и UPDATE. Без этого параметра деление на ноль возвращает предупреждение и вставляет в таблицу NULL.

Page 24: раскрываем магию My sql или о строгости и мягкости mysql
Page 25: раскрываем магию My sql или о строгости и мягкости mysql
Page 26: раскрываем магию My sql или о строгости и мягкости mysql

STRICT_TRANS_TABLES

Включает «строгий режим» для всех баз данных, поддерживающих транзакции (InnoDB и BDB).

Включение строгого режима генерирует ошибку вместо предупреждения!

Page 27: раскрываем магию My sql или о строгости и мягкости mysql

Строгость распространяется на:

1. Поверка входных данных на соответствие заданному типу

2. Нахождение внутри диапазона для чисел и дат3. При вставке данных пропущено значение колонки,

для которой не задано значение по умолчанию и имеет атрибут NOT NULL

4. Длина значения выходит за пределы заданного диапазона

5. Для типов ENUM и SET отсутствует вставляемое или обновляемое значение

Page 28: раскрываем магию My sql или о строгости и мягкости mysql

STRICT_ALL_TABLES

STRICT_ALL_TABLES полностью соответствует STRICT_TRANS_TABLES, но действие параметра уже распространяется на все виды баз данных MySQL, а не только на те, которые поддерживают транзакции.

Из-за разницы подходов к работе транзакционных и не транзакционных таблиц не всегда есть смысл использовать данный режим.

Page 29: раскрываем магию My sql или о строгости и мягкости mysql

TRADITIONAL

Заставляет MySQL вести себя как большинство «традиционных» баз данных SQL.

Данный режим является композитным режимом, включающий в себя «строгий режим», а также ряд других режимов.

Page 30: раскрываем магию My sql или о строгости и мягкости mysql

ANSI

Композитный режим, заставляет MySQL быть «ANSI-подобным», т.е. приближенным к стандарту SQL.

Включает в себя: REAL_AS_FLOAT, PIPES_AS_CONCAT, ANSI_QUOTES, IGNORE_SPACE.

REAL_AS_FLOAT – тип данных real является синонимом float, а не double.PIPES_AS_CONCAT – разрешает использовать для конкатенации строк | | , вместо логического ИЛИ.

Page 31: раскрываем магию My sql или о строгости и мягкости mysql

ONLY_FULL_GROUP_BY

Генерирует ошибку в запросах, в которых GROUP BY имеет не полный список не агрегированных параметров из SELECT и HAVING.

Page 32: раскрываем магию My sql или о строгости и мягкости mysql

Строгий режим

Page 33: раскрываем магию My sql или о строгости и мягкости mysql

• Возвращает ошибку.• Для транзакционных таблиц откатывает транзакцию

(rollback).Для не транзакционных таблиц отменяет изменение в таблице.

Следует учесть, что в не транзакционных таблицах при изменении сразу нескольких строк, в случае ошибки отменяется только последнее значение, вместо отката всех параметров.

Page 34: раскрываем магию My sql или о строгости и мягкости mysql
Page 35: раскрываем магию My sql или о строгости и мягкости mysql

Генерирует ошибку в следующих случаях:• Тип вставляемых данных отличается от заданного

типа данных• Пропуск значения в столбце, у которого нет значения

по умолчанию и задан параметр NOT NULL.• Для чисел и дат – данные находятся вне диапазона

допустимых значений.• Для строк – превышение допустимой длины.• Для типа ENUM и SET – значение не является

допустимым для заданного перечисления.• Для столбца определённого как NOT NULL - вставка

NULL.

Page 36: раскрываем магию My sql или о строгости и мягкости mysql

Дефолтные значения для типов данных

Page 37: раскрываем магию My sql или о строгости и мягкости mysql

Порядок обработки данных

1. Если столбец имеет значение по умолчанию, то используется это значение и на этом всё заканчивается, в противном случае происходит переход к следующему шагу

2. Если столбец не имеет параметр NOT NULL, то присваивается NULL и на этом всё заканчивается, в противном случае поведение зависит от переменной sql_mode, точнее от строгости самого режима.

В строгом режиме генерируется ошибка.

Page 38: раскрываем магию My sql или о строгости и мягкости mysql

Значения по умолчанию для разных типов данных

В нестрогом режиме происходит неявное преобразование в дефолтное значение типа данных:

• Для типа int значение по умолчанию - ноль.• Для всех строк, кроме типа enum – пустая строка.• Для enum – первый нумерованный член.• Для даты и времени – нулевые значения

'0000-00-00 00:00:00‘• Для timestamp — текущая дата и время, если колонка

была автоматически инициализирована, либо нулевыми значениями '0000-00-00 00:00:00'

Page 39: раскрываем магию My sql или о строгости и мягкости mysql

Нестрогий режим

Page 40: раскрываем магию My sql или о строгости и мягкости mysql

Случаи обработки некорректных данных

• Запросы на модификация данных: INSERT, UPDATE, REPLACE или LOAD DATA INFILE.

• Обновление описания схем таблиц: ALTER TABLE.

• Задание значения по умолчанию (DEFAULT) в описании колонок.

В нестрогом режиме значение приводится к корректному значению и генерируется предупреждение.

Для просмотра ошибок используйте SHOW WARNINGS.

Page 41: раскрываем магию My sql или о строгости и мягкости mysql

Выход из диапазона допустимых значений

Если число меньше минимального значения допустимого диапазона, то присваивается минимально-допустимое число. Если больше максимального – максимально-допустимое.

Page 42: раскрываем магию My sql или о строгости и мягкости mysql

Обработка строк

Строки длиннее заданной длины колонки усекаются.

Page 43: раскрываем магию My sql или о строгости и мягкости mysql

ENUM и SET типы данных

Если присваиваемое значение колонке с типом ENUM не перечислено в определении ENUM, то MySQL преобразует его в пустую строку.

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

Page 44: раскрываем магию My sql или о строгости и мягкости mysql
Page 45: раскрываем магию My sql или о строгости и мягкости mysql

Преобразование в тип даты

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

Page 46: раскрываем магию My sql или о строгости и мягкости mysql
Page 47: раскрываем магию My sql или о строгости и мягкости 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

Page 48: раскрываем магию My sql или о строгости и мягкости mysql

Присвоение NULLдля колонки с NOT NULL

Результат зависит от того, будет вставлена одна строка или множество в INSERT запрос.

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

Page 49: раскрываем магию My sql или о строгости и мягкости mysql

ALTER TABLE

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

Если на колонку налагается ограничение NOT NULL, то все NULL значения конвертируются в значения по умолчанию для заданного типа данных текущей колонки.

Page 50: раскрываем магию My sql или о строгости и мягкости mysql
Page 51: раскрываем магию My sql или о строгости и мягкости mysql
Page 52: раскрываем магию My sql или о строгости и мягкости mysql

Извлекаем плюсы

Page 53: раскрываем магию My sql или о строгости и мягкости mysql

Ключевое слово IGNORE

Ключевое слово IGNORE заставляет MySQL использовать нестрогий режим для запроса. Также используется для генерации предупреждения вместо ошибки, при нарушении целостности первичного ключа (PRIMARY KEY) или уникальности (UNIQUE).

Page 54: раскрываем магию My sql или о строгости и мягкости mysql
Page 55: раскрываем магию My sql или о строгости и мягкости mysql

ON DUPLICATE KEY UPDATE

Используется для выполнения вставки данных, либо при их обновлении и нарушении целостности первичного ключа (PRIMARY KEY) или уникальности (UNIQUE).

Page 56: раскрываем магию My sql или о строгости и мягкости mysql
Page 57: раскрываем магию My sql или о строгости и мягкости mysql

ВОПРОСЫ?