it-swarm.asia

تم اقتطاع البيانات للعمود

DECLARE float_one, float_two, my_result NUMERIC(7,2)    
my_result = CONVERT(float_one/float_two, DECIMAL(7,2));

في استعلام الخلية هذا ، أقوم بهذا النوع من العمليات في إجراء مخزن ، ولكن phpmyadmin بيئة Linux يطرح التحذير التالي:

ملاحظة: # 1265 تم اقتطاع البيانات للعمود "float_one" في الصف 5

هل لدى أي شخص فكرة كيف يمكنني حل هذه المشكلة؟

CREATE TABLE IF NOT EXISTS `float_sample` (
      `id` int(11) NOT NULL auto_increment,
      `first_number` float(10,3) default NULL,
      `second_number` float(10,3) default NULL,
      PRIMARY KEY  (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=3 ;

INSERT INTO `float_sample` (`id`, `first_number`, `second_number`) 
VALUES    (1, 2.900, 1.900),    (2, 3.100, 22.100);

والإجراء

DELIMITER $$
DROP PROCEDURE IF EXISTS float_test$$
CREATE PROCEDURE float_test(IN my_ID INT)  

BEGIN
DECLARE first_float, second_float DECIMAL(10,3);

DECLARE done INT DEFAULT 0;

DECLARE myCursor CURSOR FOR 
        SELECT `first_number`, `second_number`
        FROM `float_sample`
        WHERE `id` = my_ID;

DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;

OPEN myCursor;
my_loop:LOOP
    FETCH myCursor INTO first_float, second_float;

    IF done = 1 THEN
        LEAVE my_loop;
    END IF;

END LOOP my_loop;
CLOSE myCursor;

-- SELECT first_float, second_float;
END;$$
DELIMITER ;

والنتيجة

1 70 10:41:36    CALL mytests.float_test(1) 0 row(s) affected, 2 warning(s):
1265 Data truncated for column 'first_float' at row 2
1265 Data truncated for column 'second_float' at row 2  0.032 sec
6
dole doug

ما هي قيمة float_one في وقت التحويل ؟؟؟

لاحظ هذا المثال من MySQL 5.5.12 في Windows

mysql> select convert(20000,decimal(7,2));
+-----------------------------+
| convert(20000,decimal(7,2)) |
+-----------------------------+
|                    20000.00 |
+-----------------------------+
1 row in set (0.00 sec)

mysql> select convert(200000,decimal(7,2));
+------------------------------+
| convert(200000,decimal(7,2)) |
+------------------------------+
|                     99999.99 |
+------------------------------+
1 row in set, 1 warning (0.00 sec)

mysql> show warnings;
+---------+------+-----------------------------------------------------------------------+
| Level   | Code | Message                                                               |
+---------+------+-----------------------------------------------------------------------+
| Warning | 1264 | Out of range value for column 'convert(200000,decimal(7,2))' at row 1 |
+---------+------+-----------------------------------------------------------------------+

1 row in set (0.00 sec)

قد يكون من الممكن اقتطاع البيانات إذا كان رقم أكبر من 99999.99 في float_one. ربما كان mysql يقوم بتحويل float_one و float_two إلى DECIMAL (7،2) بشكل فردي قبل إجراء القسمة. حاول استخدام DECIMAL (10،2) أو أكبر لاستيعاب القيم الكبيرة.

تحديث 2011-07-25 15:05 EDT

هناك مشكلة اقتطاع محددة تحدث هنا

حسب دليل مرجع MySQL صفحة 442 الفقرات 2،

يتم تخزين القيم العشرية والعددية كسلاسل ، بدلاً من أرقام الفاصلة العائمة الثنائية ، من أجل الحفاظ على الدقة العشرية لتلك الأرقام. يتم استخدام حرف واحد لكل رقم من القيمة ، ونقطة الدياميل (إذا كان المقياس> 0) وعلامة - (للأرقام السالبة). إذا كان المقياس يساوي 0 ، فلن تحتوي القيم العشرية والأرقام على أي علامة عشرية أو جزء كسري.

النطاق الأقصى لـ DECIMAL و NUMERIC هو نفس النطاق لـ DOUBLE ، ولكن النطاق الفعلي للعمود DECIMAL أو NUMERIC المحدد يمكن تقييده بالدقة والقياس لعمود العطاء ، عندما يتم تعيين قيمة لهذا العمود مع المزيد من الأرقام التالية الفاصلة العشرية مما يسمح به المقياس المحدد ، يتم تقريب القيمة إلى ذلك المقياس. عندما يتم تعيين عمود DECIMAL أو NUMERIC بقيمة يتجاوز حجمها النطاق الذي تنطوي عليه الدقة والقياس المحدد (أو الافتراضي) ، يقوم MySQL بتخزين القيمة التي تمثل نقطة النهاية المقابلة لهذا النطاق.

تحتاج إلى استيعاب دقة و/أو مقياس أكبر.

هنا مثال لماذا

لقد كتبت هذا الإجراء المخزن باستخدام المواصفات الخاصة بك DECMIAL و NUMERIC.

DELIMITER $$

DROP PROCEDURE IF EXISTS `test`.`NumTest` $$
CREATE PROCEDURE `test`.`NumTest` (num1 NUMERIC(7,2), num2 NUMERIC(7,2))
BEGIN

  DECLARE float_one,float_two,my_result NUMERIC(7,2);
  DECLARE f1,f2 DOUBLE(7,2);

  SET f1 = num1;
  SET f2 = num2;

  SET float_one = num1;
  SET float_two = num2;

  SELECT f1 / f2;
  SELECT float_one / float_two;
  SELECT CONVERT(float_one / float_two,DECIMAL(7,2));
  SET my_result = CONVERT(float_one / float_two,DECIMAL(7,2));
  SELECT my_result;

END $$

DELIMITER ;

استخدمت قيمتين: 290.0 و 14.5 لهذا الاختبار.

قبل استدعاء إجراء NumTest المخزن ، قمت يدويًا بحساب 290.0/14.5

mysql> select 290.0 / 14.5;
+--------------+
| 290.0 / 14.5 |
+--------------+
|     20.00000 |
+--------------+
1 row in set (0.00 sec)

قسمت كل رقم على 100 و 10000 و 1000000 وحاولت مرة أخرى

mysql> select 2.9 / .145;
+------------+
| 2.9 / .145 |
+------------+
|   20.00000 |
+------------+
1 row in set (0.00 sec)

mysql> select .029 / .00145;
+---------------+
| .029 / .00145 |
+---------------+
|    20.0000000 |
+---------------+
1 row in set (0.00 sec)

mysql> select .00029 / .0000145;
+-------------------+
| .00029 / .0000145 |
+-------------------+
|      20.000000000 |
+-------------------+
1 row in set (0.00 sec)

حتى الان جيدة جدا !!! الآن للإجراء المخزن.

mysql> call numtest(290.0,14.5);
+-----------+
| f1 / f2   |
+-----------+
| 20.000000 |
+-----------+
1 row in set (0.00 sec)

+-----------------------+
| float_one / float_two |
+-----------------------+
|             20.000000 |
+-----------------------+
1 row in set (0.00 sec)

+---------------------------------------------+
| CONVERT(float_one / float_two,DECIMAL(7,2)) |
+---------------------------------------------+
|                                       20.00 |
+---------------------------------------------+
1 row in set (0.00 sec)

+-----------+
| my_result |
+-----------+
|     20.00 |
+-----------+
1 row in set (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

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

mysql> call numtest(2.9,0.145);
+-----------+
| f1 / f2   |
+-----------+
| 19.333333 |
+-----------+
1 row in set (0.00 sec)

+-----------------------+
| float_one / float_two |
+-----------------------+
|             19.333333 |
+-----------------------+
1 row in set (0.00 sec)

+---------------------------------------------+
| CONVERT(float_one / float_two,DECIMAL(7,2)) |
+---------------------------------------------+
|                                       19.33 |
+---------------------------------------------+
1 row in set (0.00 sec)

+-----------+
| my_result |
+-----------+
|     19.33 |
+-----------+
1 row in set (0.00 sec)

Query OK, 0 rows affected, 1 warning (0.00 sec)

mysql> show warnings;
+-------+------+-------------------------------------------+
| Level | Code | Message                                   |
+-------+------+-------------------------------------------+
| Note  | 1265 | Data truncated for column 'num2' at row 2 |
+-------+------+-------------------------------------------+
1 row in set (0.00 sec)

الانتظار ، فقدنا بعض الدقة. ماذا حدث ؟؟؟ كيف حدث هذا ؟؟؟ تحتاج إلى استيعاب المزيد من الأرقام العشرية (> 2)

تحديث 2011-07-25 17:37 بتوقيت شرق الولايات المتحدة

استبدلت (7،2) بـ (10،7) في الإجراء المخزن واستعدت الدقة المناسبة

mysql> call numtest(2.9,0.145);
+----------------+
| f1 / f2        |
+----------------+
| 20.00000000000 |
+----------------+
1 row in set (0.00 sec)

+-----------------------+
| float_one / float_two |
+-----------------------+
|        20.00000000000 |
+-----------------------+
1 row in set (0.01 sec)

+----------------------------------------------+
| CONVERT(float_one / float_two,DECIMAL(10,7)) |
+----------------------------------------------+
|                                   20.0000000 |
+----------------------------------------------+
1 row in set (0.03 sec)

+------------+
| my_result  |
+------------+
| 20.0000000 |
+------------+
1 row in set (0.05 sec)

Query OK, 0 rows affected (0.06 sec)

mysql>
3
RolandoMySQLDBA

من ما يمكنني أن أرى الإجراء المخزن الخاص بك فقط يتكرر عبر الصفوف - لا "يحفظ البيانات" في أي مكان وقد قمت بالتعليق على select:

- SELECT first_float و second_float ؛

نعم ، تحصل على تحذيرات عند تحويل الحقول float(10,3) إلى decimal(10,3). يعتمد ما إذا كانت مشكلة أم لا على ما تريد القيام به مع الحقول.

هل هذه مجرد عينة من الكود الحقيقي؟ قد تحتاج إلى نشر المزيد ...

1
Jack says try topanswers.xyz