MySQL имеет много типов данных для хранения строковых данных в таблице. VARCHAR и TEXT — два из них. Оба могут хранить максимум 65535 символов, но между этими типами данных, описанными в этом руководстве, есть некоторые различия.
Существует много различий между типами данных VARCHAR и TEXT. Различия между этими типами данных описаны ниже.
Типы данных VARCHAR и TEXT по-разному хранят данные в таблице базы данных. Различные особенности этих типов данных описаны ниже.
VARCHAR | TEXT |
В основном используется для хранения небольших строковых данных. | В основном используется для хранения больших строковых данных. |
Используется для хранения строковых данных переменной длины. | Используется для хранения строковых данных фиксированной длины. |
Максимальная длина строки может быть определена. | Длина строки не может быть определена. |
Индекс нельзя применять к этому типу данных. | Индекс можно применять в этом типе данных. |
Требуется длина + 1 байт пробела, если значение длины меньше или равно 255 символам, и длина + 2 байта пробела, если длина больше или равна 256 символам. | Занимает длину +2 байта дискового пространства. |
Работает медленнее. | Работает быстрее. |
Способы объявления типов данных VARCHAR и TEXT объясняются ниже путем создания двух таблиц с полем типов данных VARCHAR и TEXT. Длина требуется для определения типа данных VARCHAR, а длина не требуется для определения типа данных TEXT.
Выполните следующую инструкцию CREATE DATABASE, чтобы создать базу данных с именем test_db.
CREATE DATABASE test_db;
Запустите следующую инструкцию запроса, чтобы выбрать базу данных test_db перед созданием таблицы.
USE test_db;
Выполните следующую инструкцию CREATE TABLE, чтобы создать таблицу клиентов, содержащую пять полей. Здесь тип данных поля id — целое число, а тип данных полей name, email, address и contact_no — varchar, содержащий значение длины.
CREATETABLE customers( id INTNOT NULL PRIMARY KEY, name VARCHAR(30) NOT NULL, email VARCHAR(50), address VARCHAR(300), contact_no VARCHAR(15));
Выполните следующую инструкцию DESCRIBE, чтобы проверить структуру таблицы клиентов.
DESCRIBE customers;
Выполните следующий запрос INSERT, чтобы вставить три записи в таблицу клиентов.
INSERT INTO `customers` (`id`, `name`, `email`, `address`, `contact_no`) VALUES ('01', 'Andrey Ex', 'Andrey@gmail.com', '25, aaaaaaaaaaaaaa, Bangladesh ', '0191275634'), ('02', 'Sasha Destroyer', 'Sasha@gmail.com', 'bbbbbbbbbbbbbbbbbb', '01855342357'), ('03', 'Masha Bubba', 'Masha@hotmail.com', 'cccccccccccccc', NULL);
Запустите следующую инструкцию SELECT, чтобы прочитать все записи таблицы клиентов.
SELECT * FROM customers;
Запустите следующую инструкцию CREATE TABLE, чтобы создать таблицу сотрудников, содержащую пять полей. Тип данных поля id — целое число. Тип данных полей name, email и contact_no — varchar. Тип данных адресного поля — текст. Здесь для поля адреса не объявлено значение длины из-за текстового типа данных.
CREATETABLE employees( id INTNOT NULL PRIMARY KEY, name VARCHAR(30) NOT NULL, email VARCHAR(50), address TEXT, contact_no VARCHAR(15));
Выполните следующую инструкцию DESCRIBE, чтобы проверить структуру таблицы сотрудников.
DESCRIBE employees;
Выполните следующий запрос INSERT, чтобы вставить три записи с одинаковым содержимым таблицы клиентов в таблицу сотрудников.
INSERT INTO `employees` (`id`, `name`, `email`, `address`, `contact_no`) VALUES ('01', 'Andrey Ex', 'Andrey@gmail.com', 'aaaaaaaaaaaaaaaaaaaaaaa', '0191275634'), ('02', 'Sasha Destroyer', 'Sasha@gmail.com', 'bbbbbbbbbbbbbbbbbbbbbb', '01855342357'), ('03', 'Masha Bubba', 'Masha@hotmail.com', 'ccccccccccccccccccc', NULL);
Выполните следующую инструкцию SELECT, чтобы прочитать все записи таблицы сотрудников.
SELECT * FROM employees;
Ранее уже упоминалось, что тип данных TEXT работает быстрее, чем тип данных VARCHAR. Вы должны выбрать базу данных, содержащую таблицы с полем типа данных VARCHAR и TEXT, и включить профилирование текущего сеанса MySQL, чтобы проверить, какой тип данных быстрее между VARCHAR и TEXT.
База данных была выбрана здесь во время создания таблицы. Таким образом, нам не нужно выбирать его снова. Выполните следующую инструкцию SET, чтобы включить профилирование SESSION.
SET SESSION profiling = 1;
Выполните следующий запрос SELECT, чтобы прочитать все записи таблицы клиентов.
SELECT * FROM customers;
Выполните следующий запрос SELECT, чтобы прочитать все записи таблицы сотрудников.
SELECT * FROM employees;
Выполните следующую команду, чтобы проверить производительность двух предыдущих запросов SELECT.
SHOW PROFILES;
Следующий вывод появится после выполнения команды SHOW PROFILES. Согласно выходным данным, запрос SELECT для таблицы клиентов содержит поле адреса типа данных VARCHAR, требуемое 0,00101000 секунд, а запрос SELECT для таблицы сотрудников, содержащей поле адреса типа данных TEXT, требует 0,00078125 секунд. Это доказывает, что тип данных TEXT работает быстрее, чем тип данных VARCHAR для тех же данных.
Вы можете сравнить выходные данные следующих двух запросов, чтобы подробно проверить производительность типов данных VARCHAR и TEXT.
SELECT * FROM INFORMATION_SCHEMA.PROFILING WHERE QUERY_ID=1; SELECT * FROM INFORMATION_SCHEMA.PROFILING WHERE QUERY_ID=2;
Оба типа данных VARCHAR и TEXT важны для создания таблиц в базе данных MySQL. Различия между этими типами данных были должным образом объяснены в этом руководстве с примерами, чтобы помочь пользователям MySQL выбрать правильный тип данных поля таблицы во время создания таблицы.
Тогда какой смысл в Varchar (кроме задания длины), если во всём он проигрывает? А если учесть, что при работе с базами TEXT значительно быстрее, то какой смысл ограничивать длину данных?
Ну как минимум можно задать индекс для Varchar