[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: проверка на число
redreem
SELECT
cast('yandex' as char),
cast('yandex' as unsigned),
case when cast('yandex' as unsigned) = cast('yandex' as char) then 1 else 0 end,
case when md5(cast('yandex' as unsigned)) = md5(cast('yandex' as char)) then 1 else 0 end
from dual;


результат:
yandex 0 1 0

почему единичка-то???
c convert та же фигня
Игорь_Vasinsky
cast('yandex' as unsigned) - строка

хоть и кажет 0, но при попытке записать в столбец с типом int - валится

_____________
HTML, CSS (Bootstrap), JS(JQuery, ExtJS), PHP, MySQL, MSSql, Posgres, (TSql, BI OLAP, MDX), Mongo, Git, SVN, CodeIgnater, Symfony, Yii 2, JiRA, Redmine, Bitbucket, Composer, Rabbit MQ, Amazon (SQS, S3, Transcribe), Docker
kaww
Цитата (redreem @ 24.03.2016 - 22:06)
почему единичка-то???

По правилам сравнения принятым в mysql. Т.е. в случае с 0 = 'yandex', оба операнда будут приведены к числу, т.е. 0=0
redreem
Игорь_Vasinsky
kaww

не понятно.
1. вы друг другу противоречите в том, какой тип получится после cast
2. гугл ничего вразумительного про приведение типов при сравнении не сказал. если поменять местами операнды - то ничего не изменится.
3. каким образом проверить, является ли строка представлением целого числа?
4. нафига вообще тогда нужны эти каст и конверт?
kaww
Цитата (redreem @ 25.03.2016 - 07:19)
вы друг другу противоречите

Но один не противоречит докам http://www.mysql.ru/docs/man/Comparison_Operators.html . А конкретно пункт
Цитата
Во всех других случаях аргументы сравниваются как действительные числа с плавающей точкой.
Цитата (redreem @ 25.03.2016 - 07:19)
3. каким образом проверить, является ли строка представлением целого числа?

Вот тут не понял, что проверить?
Цитата (redreem @ 25.03.2016 - 07:19)
4. нафига вообще тогда нужны эти каст и конверт?

Для приведения типов. один из примеров - это твой первый пост, чтобы не гадать как будет сравнивать mysql, а явно привести к нужным типам.
kaww
Цитата (Игорь_Vasinsky @ 25.03.2016 - 02:40)
cast('yandex' as unsigned) - строка

mysql с тобой не согласен:
create temporary table _test select cast('yandex' as unsigned); 
desc _test;
drop temporary table if exists _test;

Результат:
+----------------------------+-----------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------------------------+-----------------+------+-----+---------+-------+
| cast('yandex' as unsigned) | int(6) unsigned | NO | | 0 | |
+----------------------------+-----------------+------+-----+---------+-------+
redreem
kaww
Цитата
Вот тут не понял, что проверить?


на входе строка, которая может быть представлением числа, т.е. может быть '123', 'qwe'...
мне надо определить, является ли строка представлением числа или нет
kaww
Цитата (redreem @ 25.03.2016 - 08:21)
мне надо определить, является ли строка представлением числа или нет

Можно регуляркой. Или как-то так:
SELECT CAST('yandex'*1 AS CHAR) = 'yandex' AS is_numeric
Игорь_Vasinsky
create table foo select cast('yandex' as unsigned);

Data truncation: Truncated incorrect INTEGER value: 'yandex'

мускул 5.6

_____________
HTML, CSS (Bootstrap), JS(JQuery, ExtJS), PHP, MySQL, MSSql, Posgres, (TSql, BI OLAP, MDX), Mongo, Git, SVN, CodeIgnater, Symfony, Yii 2, JiRA, Redmine, Bitbucket, Composer, Rabbit MQ, Amazon (SQS, S3, Transcribe), Docker
redreem
Цитата (kaww @ 25.03.2016 - 13:29)
Цитата (redreem @ 25.03.2016 - 08:21)
мне надо определить, является ли строка представлением числа или нет

Можно регуляркой. Или как-то так:
SELECT CAST('yandex'*1 AS CHAR) = 'yandex' AS is_numeric


ага, работает. пасиб. я пробовал *1 и сравнивать с исходником, но без каст - не работало. надо было видимо скомбинировать.
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.