Неявное преобразование числа в строку

Users
Дата: 24.12.2012 07:54:02
доброго

Написал функцию с входным параметром типа varchar. Передаю в нее число - сталкиваюсь с тем, что вместо ошибки - mysql спокойно преобразовывает 1 в '1'.

Окей, изучаю вопрос, лезу в my.ini, вижу:

sql-mode="STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"

Так вот, установка какого параметра мне здесь нужна, чтобы никаких НЕЯВНЫХ преобразований не делалось?
Пока ничего из того, что написано в документации, не помогло, при этом рестарт сервера, разумеется, делался.
Размечтался было, что параметр MSSQL даст привычное поведение - ан нет.

Вопрос номер два. Допустим, что отключить бред с неявным преобразованием - невозможно. Тогда, хрен с ним, надо просто проверять, не является ли входной параметр числом. Но и здесь меня ждал сюрприз select 'asdfa' / 1; - прекрасно отрабатывает. Ребята! Как можно делить строку на число и не получить при этом ошибку?!

Есть в mysql что-то типа ISNUMBER? Это как раз проверка, что переданная переменная - число.
tanglir
Дата: 24.12.2012 08:13:37
Users,

http://dev.mysql.com/doc/refman/5.1/en/type-conversion.html

как это отключить - хз, похоже, что никак. Впрочем, мне оно и не надо было, может, кто-то сталкивался и сумел...

Users
Есть в mysql что-то типа ISNUMBER?
http://stackoverflow.com/questions/75704/how-do-i-check-to-see-if-a-value-is-an-integer-in-mysql
value REGEXP '^-?[0-9]+$'
Users
Дата: 24.12.2012 08:31:32
tanglir,

Угу, уже нашел. Уточнить хочу: UTF8. IF fNominative REGEXP '^[а-я]' = 0 then - и так далее. Можно быть уверенным, что в данном случае у меня в fNominative будет 0 всегда, если это не русские символы?
Тест прогнал, в том числе на букву ё, но как-то... Тревожит надпись, что "с многобайтными символами мы ничего не гарантируем", так в моем вольном переводе звучит:

"The REGEXP and RLIKE operators work in byte-wise fashion, so they are not multi-byte safe and may produce unexpected
results with multi-byte character sets. In addition, these operators compare characters by their byte values and
accented characters may not compare as equal even if a given collation treats them as equal."
tanglir
Дата: 24.12.2012 08:38:02
Users, так вам же цифры нужно отслеживать, а они везде однобайтные.
tanglir
Дата: 24.12.2012 08:38:16
Арабские цифры, конечно :)
Users
Дата: 24.12.2012 09:15:35
tanglir,

Чисто отвлеченно - арабские цифры - это не совсем то, что принято называть арабскими цифрами у русских. :)
Это я вам скажу, как человек, имеющий перед глазами кучу именно арабских документов.

А по сути - хочется и дальше продвинуться. Решить вопрос с вводом только русских символов вот таким REGEXP '^[а-я]' = 0
путем не вышло. "Декларация" - хорошо работает, верно. Но Декларация1" -тоже воспринимается как корректное, а хотелось бы иметь ошибку.
tanglir
Дата: 24.12.2012 10:30:06
Users
а хотелось бы иметь ошибку.
"Хочешь быть счастливым - будь им!"
REGEXP '^[а-я]$'
javajdbc
Дата: 24.12.2012 20:10:45
Users
доброго

Написал функцию с входным параметром типа varchar. Передаю в нее число - сталкиваюсь с тем, что вместо ошибки - mysql спокойно преобразовывает 1 в '1'.

Окей, изучаю вопрос, лезу в my.ini, вижу:

sql-mode="STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"

Так вот, установка какого параметра мне здесь нужна, чтобы никаких НЕЯВНЫХ преобразований не делалось?
Пока ничего из того, что написано в документации, не помогло, при этом рестарт сервера, разумеется, делался.
Размечтался было, что параметр MSSQL даст привычное поведение - ан нет.

Вопрос номер два. Допустим, что отключить бред с неявным преобразованием - невозможно. Тогда, хрен с ним, надо просто проверять, не является ли входной параметр числом. Но и здесь меня ждал сюрприз select 'asdfa' / 1; - прекрасно отрабатывает. Ребята! Как можно делить строку на число и не получить при этом ошибку?!

Есть в mysql что-то типа ISNUMBER? Это как раз проверка, что переданная переменная - число.


Тут еше хуже, поведение мускл меняется от версии кв ерсии!

вот в этом старом топике обсуждалось всякие сюрпризы типа
разного поведения IF(1='1',2,3), IF(1='a1',2,3), IF(0='a1',2,3) и других неявных преобразований
в разных версиях.

помогите составить запрос

Посмотрите -- может CAST даст некую стабильность. Или выбросит ошибку на
строке (чиста предположение, может неверное).

Вообше, если такое случается то надо подумать более серьезно про
чистоту данных, если нужно ТОЛЬКО число, то
лучше и тип колонки дать численый.
Можно разово и на входе чистить проверять.
Если в базу уже вошли нечистые данные, то
потом на них все время будут натыкатся разные запросы...
Users
Дата: 25.12.2012 12:10:40
tanglir,

Увы. select 'Цельночисленное' REGEXP '^[а-я]$' возвращает ноль.
Akina
Дата: 25.12.2012 17:58:30
Users
Есть в mysql что-то типа ISNUMBER? Это как раз проверка, что переданная переменная - число.

Уточните задачу.

select func(123)...
select func(-123)...
select func('123')...
select func('-123')...
select func(' 123')...
select func(' -123')...
select func('123 ')...
select func('-123 ')...
select func('1 23')...
select func('-1 23')...
select func('123x')...
select func('-123x')...

и прочие варианты... какие из них допустимы, какие нет - и почему именно.