Здравствуйте, дорогие читатели. Мы продолжаем изучать SQL и сегодня разберемся, как узнать длину строки в SQL.
Описание
Иногда бывает полезно узнать длину какой-то строки в поле. Конечно, можно выбрать значение, а потом в PHP посчитать его длину, но тогда это будет выполняться дольше, да и не нужно это, ведь в SQL уже есть готовая функция для данной операции.
Название функции, что логично, — LEN()
Пример
К примеру, у нас есть табличка с какими-то полями и одно поле — имя пользователя.
Нам нужно узнать, какое самое длинное имя у пользователя, но, чтобы это сделать, длину имени нужно вычислить. А делается это вот таким образом:
SELECT name, LEN(name) AS length FROM users;
В результате мы получим табличку, где будет имя пользователя в первом столбце и длина имени — во втором.
Как видите, использовать данную функцию очень просто и не нужно никаких PHP.
Спасибо за внимание!
Копирование материалов разрешается только с указанием автора (Михаил Русаков) и индексируемой прямой ссылкой на сайт (http://myrusakov.ru)!
Добавляйтесь ко мне в друзья ВКонтакте: http://vk.com/myrusakov.
Если Вы хотите дать оценку мне и моей работе, то напишите её в моей группе: http://vk.com/rusakovmy.
Если Вы не хотите пропустить новые материалы на сайте,
то Вы можете подписаться на обновления: Подписаться на обновления
Если у Вас остались какие-либо вопросы, либо у Вас есть желание высказаться по поводу этой статьи, то Вы можете оставить свой комментарий внизу страницы.
Порекомендуйте эту статью друзьям:
Если Вам понравился сайт, то разместите ссылку на него (у себя на сайте, на форуме, в контакте):
Она выглядит вот так:
Комментарии ( 1 ):
У меня выдало ошибку #1305. Погуглив я разузнал, что, в зависимости от версии phpMyAdmin или чего-то там другого, функция LEN() может не работать. Вместо неё нужно использовать LENGTH(). Такие вот дела.
Для добавления комментариев надо войти в систему.
Если Вы ещё не зарегистрированы на сайте, то сначала зарегистрируйтесь.
Функция LENGTH
Функция LENGTH используется для подсчета количества символов в строках.
Вместо LENGTH можно использовать следующие названия: OCTET_LENGTH, CHAR_LENGTH, CHARACTER_LENGTH.
Существует также функция BIT_LENGTH, которая возвращает длину в битах.
Синтаксис
Примеры
Все примеры будут по этой таблице workers, если не сказано иное:
id айди |
name имя |
---|---|
1 | Дмитрий |
2 | Кирилл |
3 | Владимир |
Пример
В данном примере создается дополнительное поле, которое содержит длину поля name:
SQL запрос выберет следующие строки:
id айди |
name имя |
length длина строки |
---|---|---|
1 | Дмитрий | 7 |
2 | Кирилл | 6 |
3 | Владимир | 8 |
Пример
В данном примере с помощью условия WHERE выбираются только те записи, в которых длина поля name больше или равна 7:
SQL запрос выберет следующие строки:
id айди |
name имя |
length длина строки |
---|---|---|
1 | Дмитрий | 7 |
3 | Владимир | 8 |
Пример
Конечно, не обязательно делать поле length, чтобы применить функцию LENGTH в условии:
Как узнать длину поля таблицы sql
The LENGTH functions return the length of char . LENGTH calculates length using characters as defined by the input character set. LENGTHB uses bytes instead of characters. LENGTHC uses Unicode complete characters. LENGTH2 uses UCS2 code points. LENGTH4 uses UCS4 code points.
char can be any of the data types CHAR , VARCHAR2 , NCHAR , NVARCHAR2 , CLOB , or NCLOB . The exceptions are LENGTHC , LENGTH2 , and LENGTH4 , which do not allow char to be a CLOB or NCLOB . The return value is of data type NUMBER . If char has data type CHAR , then the length includes all trailing blanks. If char is null, then this function returns null.
For more on character length see the following:
Restriction on LENGTHB
The LENGTHB function is supported for single-byte LOBs only. It cannot be used with CLOB and NCLOB data in a multibyte character set.
The following example uses the LENGTH function using a single-byte database character set:
SQL Server функция LEN
В SQL Server (Transact-SQL) функция LEN возвращает длину указанной строки. Важно отметить, что функция LEN не включает символы пробела в конце строки.
Синтаксис
Синтаксис функции LEN в SQL Server (Transact-SQL):
Параметры или аргументы
string – строка, длину которой вы хотите получить.
Примечание
- Функция LEN НЕ подсчитывает конечные пробелы в конце строки при вычислении длины строки.
- Функция LEN выполняет подсчет пробелов в начале строки при вычислении длины строки.
- Функция LEN вернет NULL, если строка NULL.
- См. Также функцию DATALENGTH, которая включает в себя конечные пробелы в вычислении длины.
Применение
Функция LEN может использоваться в следующих версиях SQL Server (Transact-SQL):
SQL Server vNext, SQL Server 2016, SQL Server 2015, SQL Server 2014, SQL Server 2012, SQL Server 2008 R2, SQL Server 2008, SQL Server 2005
Пример
Рассмотрим некоторые примеры SQL Server функции LEN, чтобы понять, как использовать функцию LEN в SQL Server (Transact-SQL). Например:
Здравствуйте, дорогие читатели. Мы продолжаем изучать SQL и сегодня разберемся, как узнать длину строки в SQL.
Описание
Иногда бывает полезно узнать длину какой-то строки в поле. Конечно, можно выбрать значение, а потом в PHP посчитать его длину, но тогда это будет выполняться дольше, да и не нужно это, ведь в SQL уже есть готовая функция для данной операции.
Название функции, что логично, — LEN()
Пример
К примеру, у нас есть табличка с какими-то полями и одно поле — имя пользователя.
Нам нужно узнать, какое самое длинное имя у пользователя, но, чтобы это сделать, длину имени нужно вычислить. А делается это вот таким образом:
SELECT name, LEN(name) AS length FROM users;
В результате мы получим табличку, где будет имя пользователя в первом столбце и длина имени — во втором.
Как видите, использовать данную функцию очень просто и не нужно никаких PHP.
Спасибо за внимание!
-
Создано 21.07.2014 20:16:50
-
Михаил Русаков
Копирование материалов разрешается только с указанием автора (Михаил Русаков) и индексируемой прямой ссылкой на сайт (http://myrusakov.ru)!
Добавляйтесь ко мне в друзья ВКонтакте: http://vk.com/myrusakov.
Если Вы хотите дать оценку мне и моей работе, то напишите её в моей группе: http://vk.com/rusakovmy.
Если Вы не хотите пропустить новые материалы на сайте,
то Вы можете подписаться на обновления: Подписаться на обновления
Если у Вас остались какие-либо вопросы, либо у Вас есть желание высказаться по поводу этой статьи, то Вы можете оставить свой комментарий внизу страницы.
Если Вам понравился сайт, то разместите ссылку на него (у себя на сайте, на форуме, в контакте):
-
Кнопка:
Она выглядит вот так:
-
Текстовая ссылка:
Она выглядит вот так: Как создать свой сайт
- BB-код ссылки для форумов (например, можете поставить её в подписи):
Как узнать, в каком поле (колонке) в таблице содержатся самые тяжёлые
данные, а в каком самые легкие?
Вас интересует размер в байтах, занимаемый тем или иным столбцом на диске (видимо так, раз вы упомянули sp_spaceused
)?
Не уверен, что возможно определить его точно. Точно можно узнать, сколько страниц (блоков по 8Кб, которыми SqlServer хранит данные) занимают данные всей таблицы (или индекса).
Месту на диске, отведенному под хранение конкретного столбца, по-видимому можно дать лишь некоторую оценку (которая, впрочем, не всегда будет адекватной). И с datalength
не совсем всё просто. Далее несколько подробнее.
Возьмём запрос
/*1*/ select sum(datalength([Column])) from [Table];
за основу оценки.
Во-первых. Кроме собственно данных столбца всегда есть дополнительная служебная информация, которая может иметь отношение к столбцу, но её объем между столбцами логически может делиться непропорционально их количеству в таблице (например данные заголовка строки). Т.е. оценку размера /*1*/
следует воспринимать как «не менее чем».
Чем меньше в таблице столбцов, и чем короче запись, тем больше издержки на служебные данные, тем, соответственно, дальше оценка /*1*/
от реальности. Так, для таблицы с одним коротким столбцом полный размер данных (с учётом служебной информации) может значительно превосходить «логический» размер данных самого столбца. Сравните, например, для таблицы
create table tiny_nums (value tinyint);
insert into tiny_nums (value)
select top (1048576) 1
from master.sys.all_columns a cross join master.sys.all_columns b;
результат, возвращаемый запросом /*1*/
с тем, что покажет sp_spaceused
.
Во-вторых. Значение, возвращаемое datalength
не всегда соответствует действительности. В частности, если datalength([Column])
возвращает NULL
, то физически это может быть вовсе не ноль.
Дело в том, что типы столбцов делятся на fixed-length (напр. int
, char(20)
, datetime2(0)
, uniqueidentifier
, и т.п.) и variable-length (напр. varbinary(64)
, nvarchar(30)
и т.п.). И если для variable-length оценка /*1*/
приблизительно справедлива, то для fixed-length столбцов резервируется место для хранения значения, даже если само значение NULL
.
Т.е. для fixed-length столбцов оценку /*1*/
следует скорректировать, используя вместо NULL
(если они возможны) какое-либо непустое значение, соответствующее типу столбца (например 0 для int
):
/*2*/ select sum(datalength(isnull([IntColumn], 0))) from [Table];
Также нужно учитывать, что для столбцов типа bit
возвращаемое datalength
значение равно 1. Однако если в таблице (или индексе) несколько bit
столбцов, то SqlServer объединяет их по 8 в 1 байт.
Также столбцы могут быть sparse
, что означает 0 байт на хранение NULL
(даже для fixed-length), но плюс 4 дополнительных байта на хранение значения, если оно не NULL
:
/*3*/ select sum(datalength([SparseColumn]) + 4) from [TableName];
В-третьих. Если столбец не просто присутствует в таблице, а ещё и участвует в индексах, то он «утяжеляется» кратно количеству индексов, в которых он участвует. Если столбец является ключевым в кластерном индексе, то нужно прибавить оценку кратную количеству всех некластерных индексов (т.к. в leaf-level страницах некластерных индексов содержатся значения ключей кластерного индекса). Так в таблице
create table SomeTable
(
PK_ID bigint primary key,
FK_1_ID int,
FK_2_ID int,
...
FK_10_ID int,
UID uniqueidentifier
);
create index IX_1 on SomeTable (FK_1_ID);
...
create index IX_10 on SomeTable (FK_10_ID);
самым «тяжёлым» скорее всего окажется вовсе не UID
столбец, а PK_ID
, т.к. (помимо участия в кластерном первичном ключе) значения PK_ID
будут присутствовать ещё в 10-ти некластерных индексах.
Следует учесть также, что если некластерный индекс является фильтрованным индексом, то соответствующую оценку (/*1*/
, /*2*/
или /*3*/
) нужно взять не по всей таблице, а по строкам, соответствующим фильтру такого индекса.
В-четвертых (относится к Enterprise edition). Если применяется сжатие строк или страниц таблицы
alter table [TableName]
rebuild partition = all with (data_compression = row);
либо индекса
alter index [IX_Name] on [TableName]
rebuild with (data_compression = page);
то оценки с помощью datalength
перестают быть адекватными и фактор «не менее чем» перестаёт работать.
Сравните для таблиц
create table strings (value char(2000));
insert into strings (value)
select top (10000) replicate('a', 2000)
from master.sys.all_columns a cross join master.sys.all_columns b;
и
create table strings_page (value char(2000)) with (data_compression = page);
insert into strings_page with (tablock) (value)
select top (10000) replicate('a', 2000)
from master.sys.all_columns a cross join master.sys.all_columns b;
значения оценки размера столбца с помощью datalength
c тем, что покажет sp_spaceused
. Для первой таблицы «показания» datalength
и sp_spaceused
будут близки (т.к. строка таблицы «широкая» и объем служебной информации сказывается мало), а для второй будут расходиться очень сильно.
В-пятых. Всё что было сказано до этого момента справедливо для SqlServer 2008. В более поздних версиях появились COLUMNSTORE
индексы, которые, из-за особенностей своего устройства, могут хранить данные в существенно сжатом виде. Для них оценка размера столбца с помощью datalength
также может давать неадекватный результат. Если для таблицы
create table strings_col (value char(2000));
insert into strings_col (value)
select top (10000) replicate('a', 2000)
from master.sys.all_columns a cross join master.sys.all_columns b;
create clustered columnstore index ix_clcs on strings_col;
сравнить показания sp_spaceused
с datalength
, то опять можно наблюдать сильное расхождение.
Полагаю, что данный список факторов, которые следует учитывать при оценке места, занимаемого тем или иным столбцом, не исчерпывающий.
Здравствуйте, дорогие читатели. Мы продолжаем изучать SQL и сегодня разберемся, как узнать длину строки в SQL.
Описание
Иногда бывает полезно узнать длину какой-то строки в поле. Конечно, можно выбрать значение, а потом в PHP посчитать его длину, но тогда это будет выполняться дольше, да и не нужно это, ведь в SQL уже есть готовая функция для данной операции.
Название функции, что логично, — LEN()
Пример
К примеру, у нас есть табличка с какими-то полями и одно поле — имя пользователя.
Нам нужно узнать, какое самое длинное имя у пользователя, но, чтобы это сделать, длину имени нужно вычислить. А делается это вот таким образом:
SELECT name, LEN(name) AS length FROM users;
В результате мы получим табличку, где будет имя пользователя в первом столбце и длина имени — во втором.
Как видите, использовать данную функцию очень просто и не нужно никаких PHP.
Спасибо за внимание!
Копирование материалов разрешается только с указанием автора (Михаил Русаков) и индексируемой прямой ссылкой на сайт (http://myrusakov.ru)!
Добавляйтесь ко мне в друзья ВКонтакте: http://vk.com/myrusakov.
Если Вы хотите дать оценку мне и моей работе, то напишите её в моей группе: http://vk.com/rusakovmy.
Если Вы не хотите пропустить новые материалы на сайте,
то Вы можете подписаться на обновления: Подписаться на обновления
Если у Вас остались какие-либо вопросы, либо у Вас есть желание высказаться по поводу этой статьи, то Вы можете оставить свой комментарий внизу страницы.
Порекомендуйте эту статью друзьям:
Если Вам понравился сайт, то разместите ссылку на него (у себя на сайте, на форуме, в контакте):
Она выглядит вот так:
Комментарии ( 1 ):
У меня выдало ошибку #1305. Погуглив я разузнал, что, в зависимости от версии phpMyAdmin или чего-то там другого, функция LEN() может не работать. Вместо неё нужно использовать LENGTH(). Такие вот дела.
Для добавления комментариев надо войти в систему.
Если Вы ещё не зарегистрированы на сайте, то сначала зарегистрируйтесь.
Функция LENGTH
Функция LENGTH используется для подсчета количества символов в строках.
Вместо LENGTH можно использовать следующие названия: OCTET_LENGTH, CHAR_LENGTH, CHARACTER_LENGTH.
Существует также функция BIT_LENGTH, которая возвращает длину в битах.
Синтаксис
Примеры
Все примеры будут по этой таблице workers, если не сказано иное:
id айди |
name имя |
---|---|
1 | Дмитрий |
2 | Кирилл |
3 | Владимир |
Пример
В данном примере создается дополнительное поле, которое содержит длину поля name:
SQL запрос выберет следующие строки:
id айди |
name имя |
length длина строки |
---|---|---|
1 | Дмитрий | 7 |
2 | Кирилл | 6 |
3 | Владимир | 8 |
Пример
В данном примере с помощью условия WHERE выбираются только те записи, в которых длина поля name больше или равна 7:
SQL запрос выберет следующие строки:
id айди |
name имя |
length длина строки |
---|---|---|
1 | Дмитрий | 7 |
3 | Владимир | 8 |
Пример
Конечно, не обязательно делать поле length, чтобы применить функцию LENGTH в условии:
Как узнать длину поля таблицы sql
Регистрация на форуме тут, о проблемах пишите сюда — alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите восстановить пароль
Поиск по форуму |
Расширенный поиск |
у меня вопрос: как узнать длину поля!
вернее мне надо упорядочить таблицу по длинне поля!
нужно высчитывать количество символов в поле! как это сделать?
на локалке Mysql а сервак IIS!
а как проверить наличия той или иной функции?
правильнее будет: проверить количество символов поля!
вернее упорядочить по количеству символов в поле!
Интенсив по Python: Работа с API и фреймворками 24-26 ИЮНЯ 2022. Знаете Python, но хотите расширить свои навыки?
Slurm подготовили для вас особенный продукт! Оставить заявку по ссылке — https://slurm.club/3MeqNEk
This works in MySQL and is not experimental:
$result = $this->query('SHOW COLUMNS FROM your_table_name', PDO::FETCH_ASSOC);
Now you have the following informations:
[Field] => yourfieldname
[Type] => int(10)
[Null] => NO
[Key] => PRI
[Default] =>
[Extra] => auto_increment
You can extract the lenth form [Type] => int(10) like
preg_match('/d+/', $col['Type'], $len); // gives you the number
Whole example:
$result = $pdo->query('SHOW COLUMNS FROM youTableName');
$columLen = array();
foreach($result as $key => $col){
preg_match('/d+/', $col['Type'], $len); // get the number out of 'int(10)'
$len = (isset($len[0]))? $len[0] : ''; // is there a length?
$fieldname = $col['Field']; // name of the column
$columLen[$fieldname] = $len; // save it in array
}
print_r($columLen);
Output:
Array
(
[nav_parent] => 4
[nav_show] => 1
[nav_order] => 2
)
Attention:
Certain fieldtypes, like date, datetime or text won’t show the value lenght.
Example: A field of type timestamp will show «[Type] => timestamp» and not «[Type] => timestamp (12)»