Регулярное выражение для анализа типа столбца MySQL для чисел с плавающей запятой, десятичных знаков, удвоений

#php #mysql #regex

#php #mysql #регулярное выражение

Вопрос:

В MySQL результаты DESCRIBE table_name или SHOW COLUMNS ДЛЯ table_name содержат поле типа, которое для чисел с плавающей запятой, десятичных знаков и удвоений может выглядеть как десятичное (15,3) или просто десятичное. То же самое следует для чисел с плавающей запятой и double.

В настоящее время у меня есть:

 '/^float|decimal|double(?:((d ),(d )))?$/'
 

Как мне нужно изменить это регулярное выражение, чтобы (15,3) было необязательным?

Обновление (2): несмотря на то, что (15,3) является необязательным, мне все равно нужно записать два значения, если они есть. Добавление ? сработало, но теперь оно не фиксирует 15 и 3. Предложения?

Ответ №1:

 '/^(?:float|decimal|double)(?:((d ),(d )))?/'
 

Окружите ((d ),(d )) часть группой без захвата ( (?:) ) и сделайте ее необязательной ( ? ).

Кстати: $ в конце отсутствует намеренно?

Комментарии:

1. Нет. Я не знал, что мне это нужно.

2. Мне все еще нужно захватить необязательную часть, если она существует. Как это меняет регулярное выражение?

3. @NoahGoodrich Два числа все еще записываются, если они существуют 😉

Ответ №2:

Вам просто нужно добавить ? в группу, которую вы хотите сделать необязательной. Это означает «не более одного». Итак, вам понадобится:

 '/^(?:float|decimal|double)(((d ),(d )))?/'
 

Ответ №3:

Попробуйте прочитать данные из таблицы information_schema.columns.

Например:

 SELECT TABLE_SCHEMA, TABLE_NAME, COLUMN_NAME, DATA_TYPE, COLUMN_TYPE FROM information_schema.columns;
 

DATA_TYPE возвращает — decimal

Возвращает значение COLUMN_TYPE — decimal(5,2)

Комментарии:

1. Я не могу полагаться на доступ к прямому чтению INFORMATION_SCHEMA.

2. База данных INFORMATION_SCHEMA всегда доступна.

Ответ №4:

 SELECT * FROM mytable WHERE mycolumn REGEXP "^(((float|decimal|double)(\([[:digit:]] ,[[:digit:]] \))?))$";
 

Это будет соответствовать обоим вашим случаям. Он ожидает либо число с плавающей запятой, десятичное или двойное, либо десятичное число (хотя бы одна цифра, хотя бы одна цифра)

Ответ №5:

Возможно, этот блог может вам помочь!!!

http://qpassablog.blogspot.com.es/2014/02/expresiones-regulares-en-mysql.html

Хорошо, извините за неудобства. Это решение:

Чтобы проверить, является ли значение поля десятичным числом, вы можете использовать следующее выражение

РЕГУЛЯРНОЕ ВЫРАЖЕНИЕ ‘^[[: цифра:]] .{0,1}[[: цифра:]]*$’

Пример: выберите ‘3.222’ REGEXP ‘^[[:digit:]] .{0,1}[[: цифра:]]*$’ как пруэба;

Ответ №6:

База данных INFORMATION_SCHEMA очень полезна, потому что она разбивает информацию. Однако доступ к нему может быть невероятно медленным. На моем веб-хостинге это занимает 95 секунд!