SQL-тип данных bigint рассматривается как строка методом gettype (); функция. Зачем? - PullRequest
0 голосов
/ 01 июля 2018

1) Я хочу понять, почему числовые данные, хранящиеся как bigint, отображаются как 'string', когда я звоню gettype(); в php.

2) Есть ли такая функция, как is_bigint(); для php, которая может проверить, является ли переменная bigint.

3) Как я могу проверить тип данных, когда его bigint умножается на 1 ИЛИ добавление 0 к строке, смешанной с числами и алфавитами, приведет к повторному запуску 'Notice: A non well formed numeric value encountered in line 2', и вызов gettype(); для теперь умноженного типа данных вернет: integer

1 Ответ

0 голосов
/ 01 июля 2018

Простой ответ - у PHP нет типа bigint. Драйвер базы данных, или откуда вы получаете это значение, предоставляет вам ваши данные в виде строки, потому что это единственный надежный способ представления значения.

В 64-битной системе тип int в PHP должен быть 64-битным целым числом со знаком; но в 32-битной системе он будет 32-битным, поэтому ваши значения не будут соответствовать. Вы можете проверить дважды, повторив встроенную константу PHP_INT_MAX , которая дает вам максимальное значение, которое вы можете хранить в целочисленном виде в вашей сборке PHP.

Чтобы определить, все ли значения состоят из цифр, вы можете использовать ctype_digit($value), но это не сработает для отрицательных чисел, поскольку - не является цифрой. Лучший способ, который я знаю, это использовать регулярные выражения, например, preg_match('/^-?[0-9]+/', $value).

Если ваши значения соответствуют (т. Е. Находятся между PHP_INT_MIN и PHP_INT_MAX), вы можете просто привести строку к целому числу с (int)$value или intval($value), нет необходимости в таких трюках, как +0 или *1 .

Если они этого не делают, вам нужно будет обрабатывать их как числа с плавающей точкой, что и делает PHP, если результат операции слишком велик для целого числа, но это означает, что их неточное хранение; или используйте математический модуль произвольной точности, например GMP или BCMath .

...