Chaîne numérique (taille arbitraire) -> Entiers multiples
Question
Je suis en cours d'exécution dans un problème parce que ma base de données contient des données BIGINT (nombres entiers 64 bits), mais la version de PHP est en cours d'exécution, je suis seulement 32 bits.
Alors, quand je sors valeur d'une table je me retrouve avec une chaîne numérique représentant un entier de 64 bits dans la base 10. Ce que je voudrais idéalement faire est d'utiliser l'entier de 64 bits comme bitmask. Je dois donc aller soit deux entiers de 32 bits (un représentant de la partie supérieure et une partie inférieure) ou une chaîne numérique dans la base 2.
Le problème est que je ne peux pas multiplier juste parce que mon PHP est 32 bits. Suis-je bloqué?
La solution
Vous pouvez utiliser MySQL opérateurs de décalage peu à diviser le nombre entier de 64 bits en deux entiers de 32 bits. Ainsi, vous pouvez sélectionner:
select (myBigIntField & 0xffffffff) as lowerHalf,
(myBigIntField >> 32) as upperHalf
Autres conseils
Pour traiter des entiers de taille arbitraire, vous avez deux options en PHP: GMP et méthodes de BC Math.
croire GMP est plus efficace en utilisant des ressources personnalisées, tandis que la Colombie-Britannique utilise des chaînes directement.
Si vous ne traiterez trop (en milliers ou plus) de nombres à un moment, vous pouvez utiliser directement la Colombie-Britannique.
Vous avez quelques options:
- Utilisez soit BCMath ou GMP si elles sont incluses dans votre installation de PHP. Les deux devraient fournir des entiers de longueur arbitraire.
- Demandez la base de données pour convertir l'entier à une chaîne de bits longue de 64 caractères au lieu
- Ecrire une implémentation bignum vous (plus de travail: -))