لماذا لا تخزن postgresql القيمة العائمة بالكامل (PHP)؟

StackOverflow https://stackoverflow.com/questions/1112016

سؤال

أحاول تخزين قيمة النقطة العائمة PHP 63.59072952118762 في عمود دقيق مزدوج في Postgres. Postgres تخزن القيمة 63.59073. هل يعرف أحد لماذا؟ يجب أن يكون 8 البايت أكثر من كافية لهذه القيمة. لقد حاولت مع رقم البيانات الرقمي، والذي يعمل عند تحديد الدقة، ولكن لا ينبغي أن يكون ذلك ضروريا حقا.

تحديث: نفس المشكلة موجودة عند محاولة تخزين 63.5907295، لذلك اقتراح أن هناك شيئا ما يحدث مع مزدوج قبل الحصول على مخزنة يبدو واقعيا.

تحديث II (حل جزئيا): الخط الذي قمت بتعيين المعلمة المزدوجة يشبه هذا:

$stmt->bindParam(4, $this->latitude);

الشيء الذي لم أكن أعرفه هو أن PDD افتراضي عن نوعها إلى سلسلة. لقد غيرت ذلك إلى PDO :: PARAM INT في الافتقار إلى البديل الأفضل (كان PAME DOBLE غير خيار)، وحصلت على 10 أرقام دقة في المخزنة المزدوجة في Postgres (بعض التقدم، على الأقل). لقد قمت بفحص أن النوع الرقمي يعمل بشكل جيد، لذلك يبدو أن الرقم هو الطريق للذهاب عند استخدام PDO وضاعف يجب أن يكون لديك دقة أكثر من 10 عشر عشرة عشرية.

على أي حال، كما ذكر شخص ما، لا أعرف ما إذا كان يجب أن يكون لي أن يكون لدي هذا النوع من الدقة، لكنني أعتقد أن المشكلة في حد ذاتها تستحق التحقيق فيها.

هل كانت مفيدة؟

المحلول

  • كيف يمكنك تحديد ما هو postgresql يخزن؟
  • كيف ترسل البيانات إلى postgresql؟
  • كيف تحصل على البيانات مرة أخرى؟
  • كيف تعرضها؟
  • ما النوع هو العمود في قاعدة البيانات؟

هناك العديد من الأماكن العديدة على الطريق بين PHP و Postgresql حيث يمكن أن يكون هناك ارتباك حول كيفية تمثيل البيانات.


من المهم أن تشرح كيف يتم إدراج البيانات في DBMS. يؤدي استخدام القيمة الحرفية في عبارة "إدراج" إلى مجموعة مختلفة من المشكلات من استخدام المعلمات المرتبطة. إذا كتبت القيمة في SQL:

INSERT INTO SomeTable(SomeColumn) VALUES(63.xxxxxxxxx);

وتم اقتطاع البيانات، ستحصل على مشكلة في postgresql. إذا قمت بربط المتغير، فعليك التأكد من فهم ما تفعله PHP وحجز PDO PostGressQL مع القيمة - هل يتم إرساله كسلسلة مزدوجة، أو كسلسلة، وأي رمز يتعامل مع التحويل وما إلى ذلك.

يمكنك تشغيل مشكلات مماثلة مع PERL + DBI + DBD :: YourDBMS (DBD :: PG في قضيتك).

نصائح أخرى

النظر في استخدام العشرية / الرقمية اكتب إذا كنت بحاجة إلى الكثير من الدقة

يقبل postgresql تعويم (1) إلى Float (24) كما اختيار النوع الحقيقي، بينما تعويم (25) إلى Float (53) حدد الدقة المزدوجة.

على معظم المنصات PG، يحتوي النوع الحقيقي على مجموعة من 1E-37 على الأقل إلى 1E + 37 بدقة لا تقل عن 6 أرقام عشرية على الأقل. يحتوي نوع الدقة المزدوج عادة على مجموعة من 1E-307 إلى 1E + 308 بدقة لا يقل عن 15 رقما (رجع)

اي واحد تستعمل؟

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top