Типы данных MySQL
В данном пособии описаны методы выполнения основных действий с базами данных в среде MySQL. Рассмотрен синтаксис основных SQL-инструкций для создания и сопровождения реляционной базы данных. Приведены примеры управления привилегиями пользователей по работе с табличными данными. Для отладки и демонстрации примеров был использован сервер MySQL версии 5.0.1.
В приложении приведен список ключевых слов и выражений для сервера MySQL, что может быть использовано в качестве справочного пособия.
При написании учебного пособия в качестве базового источника сведений была выбрана книга [ 1 ] , т.к. в данной книге, по мнению авторов, необходимый для изучения материал представлен, во-первых, достаточно полно и, во-вторых, без излишнего нагромождения несущественных для первого ознакомления деталей.
Типы данных MySQL
Перед созданием базы данных необходимо точно определить, какие типы данных будут использованы.
Все типы данных, с которыми работает MySQL, можно разбить на три группы: числовые, текстовые и даты-времени. Рассмотрим эти типы данных по порядку.
1.1. Числовые типы данных
Числовые типы столбцов используются для хранения чисел, все числовые типы можно разбить на два подтипа: для хранения точных чисел и чисел с плавающей точкой. Все числовые типы характеризуются длиной хранимых чисел, а типы с плавающей точкой еще и числом десятичных разрядов. Эти значения указываются после объявления типа столбца, например, FLOAT(10, 2). В примере указано, что запись числа содержит 10 символов и два знака после десятичного разделителя.
Объявление числовых типов можно заканчивать ключевыми словами ZEROFILL и (или) USIGNED. Ключевое слово USIGNED означает, что столбец содержит только положительные числа или нули. ZEROFILL означает, что число будет отображено с ведущими нулями.
Типы данных NUMERIC и DECIMAL (DEC) идентичны. Эти типы данных используются для хранения чисел с плавающей точкой. Обычно их используют для хранения денежных значений.
Тип данных INTEGER можно сократить до INT. Это означает целое число в заданном диапазоне. Для хранения этого типа данных отводится 4 байта, что соответствует числам от -2 147 483 648 до 2 147 483 647. Также существует несколько вариантов типа INTEGER.
Тип данных TINYINT используется для однобайтных чисел от -128 до 127. Для хранения двухбайтных чисел (от -32 768 до 32 767) используется тип данных SMALLINT, а для хранения самых больших целых чисел (от -2 63 до 2 63 -1) используется тип BIGINT .
Числа с плавающей точкой имеют либо тип FLOAT (четырехбайтные числа в диапазоне от -3.4 * 10 38 до 3.4 * 10 38 ), либо тип DOUBLE (восьмибайтные числа в диапазоне от -10 -308 до 10 308 )
1.2. Текстовые типы данных
В типах данных char и varchar хранятся данные, состоящие из следующих компонентов:
— знаки в верхнем и нижнем регистре, например a, b и C.
— цифры, например 1, 2 и 3.
— специальные знаки, например символы @, & !.
Тип CHAR используется для хранения строк фиксированной длины. После ключевого слова CHAR обычно указывается длина строки, например, CHAR(50). Если длина строки не указана, то считается, что длина равна одному символу. Максимальная длина поля данного типа равняется 255 символам. Если число переданных в строку символов меньше указанной длины, то строка будет дополнена пробелами, если больше, то обрезана. При возврате значения пробелы будут удалены из строки.
Тип VARCHAR предназначен для хранения строк переменной длины. Как и в предыдущем типе данных задается максимальная длина строки, например, VARCHAR(30). При этом, более длинные строки, переданные в этот столбец, будут обрезаны.
Разница двух описанных типов заключается в том, что по строкам с фиксированной длиной выборка идет намного быстрее. И если важна скорость работы с базой данных, то предпочтительно выбирать именно тип CHAR.
Тип полей TEXT используется для хранения более длинных фрагментов текста, чем допускается предыдущими типами. Тип BLOB означает большой двоичный объект. Эти два типа одинаковы за исключением того, что в типе BLOB сравнение строк идет с учетом регистра символов, а в типе TEXT без учета регистра. Оба типа имеют переменную длину и оба имеют некоторые вариации:
— TINYTEXT и TINYBLOB могут хранить до 255 символов;
— TEXT и BLOB могут хранить до 64 килобайт информации;
— MEDIUMTEXT и MEDIUMBLOBмогут хранить до 16 мегабайт;
— LONGTEXT и LONGBLOB могут хранить до 4 гигабайт.
Тип ENUM позволяет перечислить набор возможных значений для ввода в поле и хранит только одно значение из представленного списка. Например, ENUM(`m`,`a`,`z`) . Если не указать, какое значение используется в поле по умолчанию, то будет использовано первое значение списка.
Тип SET аналогичен типу ENUM, но позволяет хранить несколько значений из списка значений в поле.
1.3. Типы даты и времени
Тип DATE применяется для хранения дат в формате ( гггг-мм-дд ), а тип TIME применяется для хранения времени в формате (чч:мм:сс).
Тип DATETIME объединяет два предыдущих типа и имеет формат (гггг-мм-дд чч:мм:сс ) .
Поле типа TIMESTAMP обычно используется для хранения даты и времени, когда была создана или изменена соответствующая строка.
Поле типа YEAR содержит значение года. Возможны две длины: YEAR(2) и YEAR(4) для двух, и четырех цифр года соответственно. При использовании YEAR(2) диапазон дат принимается с 1970 по 2069 годы.
Какой тип данных MySQL использовать для хранения логических значений
Поскольку в MySQL, похоже, нет какого-либо «логического» типа данных, какой тип данных вы «используете» для хранения истинной / ложной информации в MySQL?
Особенно в контексте написания и чтения из / в сценарий PHP.
Со временем я использовал и видел несколько подходов:
- tinyint, поля varchar, содержащие значения 0/1,
- поля varchar, содержащие строки ‘0’ / ‘1’ или ‘true’ / ‘false’
- и, наконец, перечислить поля, содержащие две опции ‘true’ / ‘false’.
Ничто из вышеперечисленного не кажется оптимальным. Я предпочитаю вариант tinyint 0/1, так как автоматическое преобразование типов в PHP дает мне логические значения довольно просто.
Так какой тип данных вы используете? Есть ли тип, разработанный для логических значений, который я пропустил? Видите ли вы какие-либо преимущества / недостатки при использовании того или иного типа?
Для MySQL 5.0.3 и выше вы можете использовать BIT . В руководстве сказано:
Начиная с MySQL 5.0.3, тип данных BIT используется для хранения значений битовых полей. Тип BIT (M) позволяет хранить M-битные значения. М может варьироваться от 1 до 64.
В противном случае, согласно руководству MySQL, вы можете использовать bool и boolean, которые на данный момент являются псевдонимами tinyint (1):
Bool, Boolean: Эти типы являются синонимами для TINYINT (1). Нулевое значение считается ложным. Ненулевые значения считаются истинными.
MySQL также заявляет, что:
Мы намерены реализовать полную обработку булевых типов в соответствии со стандартным SQL в будущем выпуске MySQL.
BOOL и BOOLEAN являются синонимами TINYINT(1) . Ноль есть false , все остальное есть true . Больше информации здесь .
Это элегантное решение, которое я очень ценю, поскольку оно использует ноль байтов данных:
Чтобы установить его в значение true, установите some_flag = » и установите в значение false, установите some_flag = NULL .
Затем, чтобы проверить на true, проверить, если some_flag IS NOT NULL , и проверить на false, проверить, если some_flag IS NULL .
(Этот метод описан в статье «Высокопроизводительный MySQL: оптимизация, резервное копирование, репликация и многое другое» Джона Уоррена Ленца, Барона Шварца и Арьена Ленца.)
Если вы используете тип BOOLEAN, это псевдоним TINYINT (1). Это лучше всего, если вы хотите использовать стандартизированный SQL и не обращать внимания на то, что поле может содержать значение вне диапазона (в основном все, что не равно 0, будет «истинным»).
ENUM («False», «True») позволит вам использовать строки в вашем SQL, а MySQL будет хранить поле внутри как целое число, где «False» = 0 и «True» = 1 в зависимости от порядка, указанного Enum ,
В MySQL 5+ вы можете использовать поле BIT (1) для обозначения 1-битного числового типа. Я не верю, что на самом деле это занимает меньше места в хранилище, но опять же позволяет ограничить возможные значения до 1 или 0.
Все вышеперечисленное будет использовать примерно одинаковый объем памяти, поэтому лучше выбрать тот, с которым вам проще всего работать.
На этот вопрос ответили, но я решил добавить свои 0,02 доллара. Я часто использую CHAR(0) , где » == true and NULL == false .
CHAR(0) Это также неплохо, когда вам нужен столбец, который может принимать только два значения: столбец, который определен как, CHAR(0) NULL занимает только один бит и может принимать только значения NULL и » (пустую строку).
Я использую TINYINT (1) для хранения логических значений в Mysql.
Я не знаю, есть ли какое-то преимущество, чтобы использовать это . Но если я не ошибаюсь, mysql может хранить логическое значение (BOOL) и хранить его как tinyint (1)
Бит имеет преимущество перед различными опциями байтов (tinyint, enum, char (1)), если у вас много логических полей. Одно битовое поле все еще занимает полный байт. Два битовых поля вписываются в один и тот же байт. Три, четыре, пять, шесть, семь, восемь. После чего они начинают заполнять следующий байт. В конечном итоге экономия настолько мала, что вы должны сосредоточиться на тысячах других оптимизаций. Если вы не имеете дело с огромным количеством данных, эти несколько байтов не будут складываться во много. Если вы используете бит с PHP, вам нужно ввести значения, входящие и выходящие.
До тех пор, пока MySQL не реализует битовый тип данных, если ваша обработка действительно ограничена пространством и / или временем, например, при транзакциях большого объема, создайте поле TINYINT, вызываемое bit_flags для всех ваших логических переменных, и маскируйте и сдвигайте нужный логический бит в своем SQL запрос.
Например, если ваш самый левый бит представляет ваше поле bool, а 7 самых правых битов ничего не представляют, тогда ваше bit_flags поле будет равно 128 (двоичный код 10000000). Маскируйте (скрывайте) семь крайних правых битов (используя побитовый оператор & ) и сдвигайте 8-й бит на семь пробелов вправо, заканчивая 00000001. Теперь все значение (которое в данном случае равно 1) является вашим значением.
Вы можете запускать такие заявления во время тестирования
Поскольку у вас есть 8 битов, у вас есть потенциально 8 логических переменных из одного байта. Некоторые будущие программисты всегда будут использовать следующие семь битов, поэтому вы должны замаскировать. Не просто сдвиньтесь, иначе вы создадите ад для себя и других в будущем. Убедитесь, что MySQL выполняет маскирование и сдвиг — это будет значительно быстрее, чем это делает язык веб-сценариев (PHP, ASP и т. Д.). Кроме того, убедитесь, что вы поместили комментарий в поле комментариев MySQL для своего bit_flags поля.
Типы данных MySQL. Чем руководствоваться при выборе типа данных
Далее необходимо выбрать конкретный тип данных из представленных в классе. Многие типы данных MySQL позволяют хранить данные одного и тот же вида, но с разным диапазоном значений, точностью или требуемым физическим пространством (на диске или в памяти). Некоторые типы обладают специальным поведением или свойствами.
Например, в столбцах DATETIME и TIMESTAMP можно хранить один и тот же тип данных: дату и время, с точностью до секунды. Однако тип TIMESTAMP требует вдвое меньше места, позволяет работать с часовыми поясами и обладает специальными средствами автоматического обновления. С другой стороны, диапазон допустимых значений для него намного уже.
На что обратить внимание при выборе типа данных:
- Стараться использовать типы данных минимального размера, достаточного для их правильного хранения и представления. Как правило, меньшие по размеру типы данных быстрее, поскольку занимают меньше места на диске, в памяти и в кэше процессора.
- Чем проще, тем лучше. C точки зрения системы, сравнение целых чисел проще сравнения символов, поскольку из-за различных кодировок и правил сортировки сравнение символов усложняется. Поэтому значения даты и времени лучше хранить во встроенных типах данных MySQL, а не в строках, а для IP-адресов имеет смысл использовать целочисленные типы данных.
- Стараться избегать значений NULL. Для MySQL оптимизация запросов, содержащих допускающие NULL столбцы, вызывает дополнительные сложности, поскольку из-за них усложняются индексы, статистика индексов и сравнение значений. Столбец, допускающий NULL, занимает больше места на диске и требует специальной обработки внутри MySQL. Если есть необходимость отобразить в таблице факт отсутствия значения, можно обойтись без использования NULL. Вместо этого, к примеру, можно использовать 0, специальное значение или пустую строку.
- Имеет смысл использовать в связанных столбцах одни и те же типы данных. Использование различных типов данных в связанных столбцах может замедлить обработку запроса.
Скорость при соединении столбцов типа VARCHAR и ENUM:
Соединение VARCHAR с VARCHAR
Соединение VARCHAR с ENUM
Соединение ENUM с VARCHAR
Соединение ENUM с ENUM
В целях совместимости MySQL поддерживает различные псевдонимы, например INTEGER, BOOL — это псевдонимы (синонимы) одного и того же типа данных. Данный факт может сбить с толку, но не оказывает влияния на производительность.
Числовые типы
- BIT — можно использовать для хранения одного или нескольких значений true/false в одном столбце. BIT(1) определяет поле, содержащее один бит, BIT(2) — два бита и т. д. Максимальная длина столбца типа BIT равна 64 битам. До версии MySQL 5.0 слово BIT было синонимом TINYINT. Поведение типа BIT зависит от подсистемы хранения.
Хранение целых чисел
- TINYINT(N) (синоним INTEGER, BOOL, BOOLEAN) — 8 бит;
- SMALLINT(N) — 16 бит;
- MEDIUMINT(N) — 24 бита;
- INT(N) — 32 бита;
- BIGINT(N) — 64 бита.
СУБД MySQL позволяет указывать для целых чисел «размер», например INT(11). Для большинства приложений это не имеет значения: диапазон возможных значений этим не ограничивается. Однако данный параметр говорит некоторым интерактивным инструментам MySQL, сколько позиций необходимо зарезервировать для вывода числа. С точки зрения хранения и вычисления INT(1) и INT(20) идентичны.
Целочисленный тип данных длиной N бит позволяет хранить значения от -2(N-1) до 2(N-1)-1.
Целые типы данных могут иметь необязательный атрибут UNSIGNED, запрещающий отрицательные значения и приблизительно вдвое увеличивающий верхний предел положительных значений. Например, тип TINYINT UNSIGNED позволяет хранить значения от 0 до 255, а не от -128 до 127.
Знаковые и беззнаковые типы требуют одинакового пространства и обладают одинаковой производительностью.
Необязательный атрибут ZEROFILL заполнит нулями свободные позиции слева. Например с TINYINT(3) ZEROFILL, величина 2 будет записана, как 002.
Тип данных | Бит | По умолчанию | UNSIGNED |
---|---|---|---|
TINYINT | 8 | -128 — 127 | 0 — 255 |
SMALLINT | 16 | -32768 — 32767 | 0 — 65535 |
MEDIUMINT | 24 | -8388608 — 8388607 | 0 — 16777215 |
INT | 32 | -2147483648 — 2147483647 | 0 — 4294967295 |
BIGINT | 64 | -9223372036854775808 — 9223372036854775807 | 0 — 18446744073709551615 |
Хранение дробных чисел
Все типы допускают приближенные математические вычисления с плавающей точкой, но в случае с FLOAT и DOUBLE операции выполняются быстрее, так как процессор выполняет их естественным для него образом.
- FLOAT(M,D) — число с плавающей точкой небольшой точности, задействует 4 байта.
- DOUBLE(M,D) (синонимы REAL, DOUBLE PRECISION) — число с плавающей точкой двойной точности. Задействует 8 байт, имеет большую точность и больший диапазон значений.
- DECIMAL(M,D) (синонимы DEC, NUMERIC, FIXED) — дробное число, хранящееся в виде строки, если десятичное значение равно 0, значение не будет иметь десятичной запятой или дробной части. Предназначен для хранения точных дробных чисел (можно хранить большие целые числа, не помещающиеся в типе BIGINT). Имеет смысл использовать только тогда, когда нужны точные результаты при вычислениях с дробными числами, — например, при хранении финансовых данных. Задействует больше пространства.
M — количество отводимых под число символов. D — количество символов дробной части.
Для типов с плавающей точкой можно указать максимально разрешенное количество цифр до и после десятичной запятой. В случае с DECIMAL это влияет на объем пространства, требуемого для хранения данных столбца. При указании точности, в некоторых случаях, MySQL незаметно для пользователя может выбирать другой тип данных или будет округлять значения при сохранении. Поэтому рекомендуют указывать желаемый тип, но не точность.
FLOAT и DOUBLE могут иметь параметр UNSIGNED, запрещающий отрицательные числа, но диапазон значений от этого не изменится.
Число типа DECIMAL в MySQL 5.0 и более новых версиях может содержать до 65 цифр. В более ранних версиях MySQL тип DECIMAL имел предел 254 цифры и хранил значения в виде неупакованных строк (один байт на цифру). Однако эти версии СУБД не умели использовать такие большие числа в вычислениях, поскольку тип DECIMAL был просто форматом хранения. При выполнении каких-либо операций значения DECIMAL преобразовывались в тип DOUBLE.
Строковые типы
В типах CHAR и VARCHAR строки рассматриваются как последовательности символов, поэтому, при использовании многобайтных кодировок, например UNICODE, размер строки в байтах будет больше, чем в символах.
- VARCHAR(N) — хранит символьные строки переменной длины и является наиболее общим строковым типом данных. Значение N может принимать значения от 0 до 65535 (до версии MySQL 5.0.3 значение N могло быть от 0 до 255). Строки этого типа могут занимать меньше места, чем строки фиксированной длины CHAR. Происходит это потому, что в VARCHAR используется лишь то количество места, которое действительно необходимо (за исключением таблиц у которых задан фиксированный размер строк). В типе VARCHAR используется один или два дополнительных байта для хранения длины строки: один байт, если максимальная длина строки в столбце не превышает 255 байт, и два байта в случае более длинных строк. Т.е. тип VARCHAR(10) может занимать до 11 байт. Тип VARCHAR(1000) занимает до 1002 байт, поскольку в данном случае для хранения информации о длине строки требуется два байта. VARCHAR увеличивает производительность за счет меньшего потребления места на диске. Однако поскольку строки имеют переменную длину, они способны увеличиваться при обновлении, что вызывает дополнительную нагрузку. Если строка становится длиннее и больше не помещается в ранее отведенное для нее место, то ее дальнейшее поведение зависит от подсистемы хранения. Обычно имеет смысл использовать тип VARCHAR при соблюдении хотя бы одного из следующих условий: максимальная длина строки в столбце значительно больше средней; обновление поля выполняется редко, так что фрагментация не представляет проблемы; либо используется сложная кодировка, например UTF-8, в которой для хранения одного символа используется переменное количество байтов.
- CHAR(N) — имеет фиксированную длину, от 0 до 255 байт. При сохранении коротких значений CHAR они дополняются справа пробелами до указанной длины. Тип CHAR полезен, когда требуется сохранять очень короткие строки или все значения имеют приблизительно одинаковую длину. Например, CHAR является хорошим выбором для хранения MD5-сверток паролей пользователей, которые всегда имеют одинаковую длину. Тип CHAR также имеет преимущество над VARCHAR для часто меняющихся данных, поскольку строка фиксированной длины не подвержена фрагментации. В случае очень коротких столбцов тип CHAR также эффективнее, чем VARCHAR.
При создании таблицы нельзя комбинировать столбцы типов CHAR и VARCHAR. Если такое произойдет, то MySQL изменит тип столбцов CHAR на тип VARCHAR.
Представим что строковый тип применяется для хранения значений Y и N. В случае использования CHAR(1) значение займет один байт, тогда как для типа VARCHAR(1) потребуется два байта из-за наличия дополнительного байта длины строки.
Значение | CHAR(4) | Требуется хранилище | VARCHAR(4) | Требуется хранилище |
---|---|---|---|---|
» | ‘ ‘ | 4 байта | » | 1 байт |
‘ab’ | ‘ab ‘ | 4 байта | ‘ab’ | 3 байта |
‘abcd’ | ‘abcd’ | 4 байта | ‘abcd’ | 5 байт |
‘abcdefgh’ | ‘abcd’ | 4 байта | ‘abcd’ | 5 байт |
Двоичные строки
Для совместимости со старыми версиями MySQL введены два специальных типа данных: BINARY и VARBINARY, которые эквивалентны типам CHAR и VARHAR, однако строка в них рассматривается как последовательность байтов, а не символов. К BINARY строкам не применимы кодировки и сортируются они как обычные последовательности байтов. Эти типы могут быть полезны, когда нужно сохранять двоичные данные, и вы хотите, чтобы MySQL сравнивал значение как байты, а не как символы. При этом, двоичное сравнение может оказаться значительно проще и быстрее символьного.
- VARBINARY — хранит бинарные строки переменной длины.
- BINARY — хранит бинарные строки фиксированной длины.
Текстовые и бинарные типы
Предназначены для хранения больших объемов двоичных или символьных данных.
MySQL обрабатывает значения BLOB и TEXT как отдельные объекты. Единственное различие между семействами BLOB и TEXT заключается в том, что типы BLOB хранят двоичные данные без учета схемы упорядочения и кодировки, а с типами TEXT ассоциированы схемы упорядочения и кодировка.
Семейство TEXT используется для хранения непосредственно текста:
- TEXT (синоним SMALLTEXT)
- TINYTEXT
- MEDIUMTEXT
- LONGTEXT
Cемейство BLOB — для хранения изображений, звука, электронных документов и т.д.:
- BLOB (синоним SMALLBLOB)
- TINYBLOB
- MEDIUMBLOB
- LONGBLOB
MySQL не может индексировать данные этих типов по полной длине и не может использовать для сортировки индексы.
Мистер MySQL спешит на помощь. Или, что такое MySQL простыми и понятными словами
Управление небольшим сайтом кажется простой задачей. Несколько файлов html легко редактируются вручную. Но сайт это динамичная структура, имеющая склонность к росту. А когда ваш сайт разрастается, управлять большим объёмом его данных вручную становится невозможно.
Для упрощения работы с большим количеством информации и были придуманы базы данных. Сейчас разберёмся подробнее, что это такое.
Структурирование информации в базу упрощает работу с ней, её легче и быстрее обрабатывать и изменять. Для работы с базами данных придуман специальный софт.
Наиболее распространенной сегодня программой для управления БД является mysql. Это сравнительно простой в освоении и дальнейшей работе инструмент. Этот софт применяют для обработки реляционных баз данных.
Как это устроено?
Реляционная база данных похожа на таблицу, состоящую из столбцов и строк, которые образуют ячейки. Поддерживаемые mysql типы данных, которые можно распределить в эти ячейки, условно делятся на три категории. Это числовые и символьные типы (строковые), а так же отдельный тип для хранения даты и времени.
В таблицу дата и время записывается двумя типами DATETIME и TIMESTAMP. Отличия их в том, что первый тип отображает данные о времени в том же виде, в котором они были сохранены. А второй тип при извлечении данных сделает поправку на часовой пояс. Важно не путать эти элементы при создании собственного сайта или приложения.
Отдельным классом логический тип данных не представлен. Для работы с операциями, использующими только примитивные значения — true и false — применяют числовой тип tinyint. А в ячейке тогда будет либо 0, либо 1. Использование строковых значений NULL может привести к ошибке при переносе базы в другую СУБД.
Прокачайте mysql-ы вашей базы данных
Популярность mysql объясняется набором весомых преимуществ. В первую очередь это надёжный софт и при этой быстрый. К тому же исходный код разработчики оставили открытым, что позволяет вносить необходимые индивидуальные правки, если такие понадобятся. Ваша база данных будет обработана оптимально. Ко всему эта программа распространяется бесплатно.
Для оптимизации скорости поиска информации по базе в mysql создан инструмент индекс. Это набор критериев, по которому работает поиск по ячейкам базы. Без применения индексации поиск всегда будет проходить от начала до конца. Для больших БД это слишком затратный по времени процесс. А поиск по индексу значительно снижает количество требуемых операций для поиска.
С момента релиза первой mysql в 1998 году прошло много лет. С каждой новой версией эта программа обрастала новыми функциями возможностями, расширяющими функционал. Улучшения оптимизировали работу программы, повышая производительность.
Проверить, какая версия mysql установлена на сервере, можно посредством команды mysql -v. Самая последняя версия на сегодня — 5.7.20, вышедшая в октябре этого года.
Формирование базы данных значительно упростит работу с сайтом, особенно если приходится управлять им самостоятельно. Кроме колоссального объёма информации создание и поддержание сайта подразумевает немало других трудностей. В обучающем курсе Михаила Русакова « PHP и MySQL с Нуля до Гуру » можно найти полезные советы, позволяющие справиться с ними быстро.
В моём блоге есть ещё много полезных статей с похожей тематикой. Чтобы не пропустить новые, подпишитесь на обновления, форма для подписки вверху. За актуальными новостями можно следить и со своей странички, подписавшись на мою группу Вконтакте . Кстати, мой блог работает с применением технологий, описанных в этой статье.