Maison > base de données > tutoriel mysql > Quel type MySQL utilise-t-il pour les décimales ?

Quel type MySQL utilise-t-il pour les décimales ?

青灯夜游
Libérer: 2021-12-01 16:41:00
original
33509 Les gens l'ont consulté

Les types disponibles pour les décimales MySQL : 1. Type FLOAT, qui peut stocker des nombres à virgule flottante simple précision ; 2. Type DOUBLE, qui peut stocker des nombres à virgule flottante double précision ; 3. Type DECIMAL, utilisé pour stocker des nombres décimaux précis ; valeurs, telles que la devise dans les données des systèmes comptables.

Quel type MySQL utilise-t-il pour les décimales ?

L'environnement d'exploitation de ce tutoriel : système windows7, version mysql8, ordinateur Dell G3.

Les nombres à virgule flottante et les nombres à virgule fixe sont utilisés pour représenter les décimales dans MySQL.

Il existe deux types à virgule flottante, les nombres à virgule flottante simple précision (FLOAT) et les nombres à virgule flottante double précision (DOUBLE) ; il n'existe qu'un seul type à virgule fixe, qui est DECIMAL ;

Les types à virgule flottante et les types à virgule fixe peuvent être représentés par (M, D), où M est appelé précision, indiquant le nombre total de chiffres ; D est appelé échelle, indiquant le nombre de chiffres décimaux.

La plage de valeurs du type de nombre à virgule flottante est M (1 ~ 255) et D (1 ~ 30, et ne peut pas être supérieure à M-2), qui représentent respectivement la largeur d'affichage et le nombre de décimales. M et D sont facultatifs dans FLOAT et DOUBLE, et les types FLOAT et DOUBLE seront enregistrés avec la précision maximale prise en charge par le matériel. La valeur D par défaut pour DECIMAL est 0 et la valeur M est 10.

Le tableau suivant répertorie les types décimaux et les exigences de stockage dans MySQL.

Quel type MySQL utilise-t-il pour les décimales ?

Le type DECIMAL est différent de FLOAT et DOUBLE. DOUBLE est en fait stocké sous la forme d'une chaîne. La plage de valeurs maximale possible de DECIMAL est la même que celle de DOUBLE, mais la plage de valeurs effective est déterminée par M et D. Si M est modifié et D est fixe, la plage de valeurs s'élargit à mesure que M grandit.

Comme vous pouvez le voir dans le tableau ci-dessus, l'espace de stockage de DECIMAL n'est pas fixe, mais est déterminé par la valeur de précision M, occupant M+2 octets.

La plage de valeurs du type FLOAT est la suivante :

  • La plage de valeurs signée : -3.402823466E+38~-1.175494351E-38.值 La valeur du non-symbole : 0 et -1.175494351E-38 ~ -3.402823466e+38. La plage de valeurs du type

  • DOUBLE est la suivante :

La plage de valeurs signée : -1.7976931348623157E+308~-2.2250738585072014E-308. ♥                                                                                    plage de valeurs non signées : 0 et -2,2250738585072014E-30 8~-1.7976931348623157E+308.

  • Remarque
  •  : Qu'il s'agisse d'un type à virgule fixe ou à virgule flottante, si la précision spécifiée par l'utilisateur dépasse la plage de précision, elle sera arrondie pour le traitement.
  • FLOAT et DOUBLE prendront par défaut la précision réelle lorsque la précision n'est pas spécifiée. DECIMAL sera par défaut (10, 0) si la précision n'est pas spécifiée.

L'avantage des nombres à virgule flottante par rapport aux nombres à virgule fixe est qu'ils peuvent représenter une plage plus large lorsque la longueur est constante ; l'inconvénient est que cela peut entraîner des problèmes de précision.

Type DECIMAL

Le type de données DECIMAL est utilisé pour stocker des valeurs précises dans la base de données. Nous utilisons souvent le type de données DECIMAL pour les colonnes qui conservent une précision précise, comme les données monétaires dans les systèmes comptables.

Pour définir une colonne avec le type de données DECIMAL, utilisez la syntaxe suivante :

column_name  DECIMAL(P,D);
Copier après la connexion
Dans la syntaxe ci-dessus :

    P est le nombre de chiffres significatifs précision. La plage de P est 1~65.

    D représente le nombre de chiffres après la virgule décimale. La plage de D est 0~30. MySQL exige que D soit inférieur ou égal à (<=) P. DECIMAL数据类型用于在数据库中存储精确的数值。我们经常将DECIMAL数据类型用于保留准确精确度的列,例如会计系统中的货币数据。

    要定义数据类型为DECIMAL的列,请使用以下语法:

    amount DECIMAL(6,2);
    Copier après la connexion

    在上面的语法中:

    • P是表示有效数字数的精度。 P范围为1〜65
    • D是表示小数点后的位数。 D的范围是0~30。MySQL要求D小于或等于(<=)P

    DECIMAL(P,D)表示列可以存储D位小数的P位数。十进制列的实际范围取决于精度和刻度。

    与INT数据类型一样,DECIMAL类型也具有UNSIGNEDZEROFILL属性。 如果使用UNSIGNED属性,则DECIMAL UNSIGNED的列将不接受负值。

    如果使用ZEROFILL,MySQL将把显示值填充到0以显示由列定义指定的宽度。 另外,如果我们对DECIMAL列使用ZERO FILL,MySQL将自动将UNSIGNED属性添加到列。

    以下示例使用DECIMAL数据类型定义的一个叫作amount的列。

    column_name DECIMAL(P);
    Copier après la connexion

    在此示例中,amount列最多可以存储6位数字,小数位数为2位; 因此,amount列的范围是从-9999.999999.99

    MySQL允许使用以下语法:

    column_name DECIMAL(P,0);
    Copier après la connexion

    这相当于:

    column_name DECIMAL;
    Copier après la connexion

    在这种情况下,列不包含小数部分或小数点。

    此外,我们甚至可以使用以下语法。

    amount DECIMAL(19,2);
    Copier après la connexion
    Copier après la connexion

    在这种情况下,P的默认值为10

    DECIMAL(P, D) signifie que la colonne peut stocker P chiffres de D décimales. La plage réelle d'une colonne décimale dépend de la précision et de l'échelle. Comme le type de données INT, le type DECIMAL possède également les attributs UNSIGNED et ZEROFILL. Si l'attribut UNSIGNED est utilisé, la colonne DECIMAL UNSIGNED n'acceptera pas de valeurs négatives. Si vous utilisez ZEROFILL, MySQL complétera la valeur d'affichage à 0 pour afficher la largeur spécifiée par la définition de colonne. De plus, si nous utilisons ZERO FILL sur une colonne DECIMAL, MySQL ajoutera automatiquement l'attribut UNSIGNED à la colonne.

    🎜L'exemple suivant utilise une colonne appelée amount définie à l'aide du type de données DECIMAL. 🎜
    amount DECIMAL(19,4);
    Copier après la connexion
    Copier après la connexion
    🎜Dans cet exemple, la colonne amount peut stocker jusqu'à 6 chiffres avec 2 décimales, donc La plage de ; la colonne montant va de -9999.99 à 9999.99. 🎜🎜MySQL autorise la syntaxe suivante : 🎜
    CREATE TABLE test_order (
        id INT AUTO_INCREMENT PRIMARY KEY,
        description VARCHAR(255),
        cost DECIMAL(19,4) NOT NULL
    );
    Copier après la connexion
    Copier après la connexion
    🎜 Cela équivaut à : 🎜
    INSERT INTO test_order(description,cost)
    VALUES(&#39;Bicycle&#39;, 500.34),(&#39;Seat&#39;,10.23),(&#39;Break&#39;,5.21);
    Copier après la connexion
    Copier après la connexion
    🎜 Dans ce cas, la colonne ne contient pas de partie décimale ni de point décimal. 🎜🎜De plus, nous pouvons même utiliser la syntaxe suivante. 🎜
    SELECT * from test_order
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion
    🎜Dans ce cas, la valeur par défaut de P est 10. 🎜🎜🎜🎜Stockage DÉCIMAL MySQL🎜🎜🎜

    MySQL分别为整数和小数部分分配存储空间。 MySQL使用二进制格式存储DECIMAL值。它将9位数字包装成4个字节。

    对于每个部分,需要4个字节来存储9位数的每个倍数。剩余数字所需的存储如下表所示:

    剩余数字
    00
    1–21
    3–42
    5–63
    7-94

    例如,DECIMAL(19,9)对于小数部分具有9位数字,对于整数部分具有19位= 10位数字,小数部分需要4个字节。 整数部分对于前9位数字需要4个字节,1个剩余字节需要1个字节。DECIMAL(19,9)列总共需要9个字节。

    MySQL DECIMAL数据类型和货币数据

    经常使用DECIMAL数据类型的货币数据,如价格,工资,账户余额等。如果要设计一个处理货币数据的数据库,则可参考以下语法 -

    amount DECIMAL(19,2);
    Copier après la connexion
    Copier après la connexion

    但是,如果您要遵守公认会计原则(GAAP)规则,则货币栏必须至少包含4位小数,以确保舍入值不超过$0.01。 在这种情况下,应该定义具有4位小数的列,如下所示:

    amount DECIMAL(19,4);
    Copier après la connexion
    Copier après la connexion

    MySQL DECIMAL数据类型示例

    首先,创建一个名为test_order的新表,其中包含三列:iddescriptioncost

    CREATE TABLE test_order (
        id INT AUTO_INCREMENT PRIMARY KEY,
        description VARCHAR(255),
        cost DECIMAL(19,4) NOT NULL
    );
    Copier après la connexion
    Copier après la connexion

    第二步,将资料插入test_order表。

    INSERT INTO test_order(description,cost)
    VALUES(&#39;Bicycle&#39;, 500.34),(&#39;Seat&#39;,10.23),(&#39;Break&#39;,5.21);
    Copier après la connexion
    Copier après la connexion

    第三步,从test_order表查询数据。

    SELECT * from test_order
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion

    第四步,更改cost列以包含ZEROFILL属性。

    ALTER TABLE test_order
    MODIFY cost DECIMAL(19,4) zerofill;
    Copier après la connexion

    第五步,再次查询test_order表。

    SELECT * from test_order
    Copier après la connexion
    Copier après la connexion
    Copier après la connexion

    查询结果

    如上所见,在输出值中填充了许多零。

    因为zerofill,当我们插入负值会报错:

    INSERT INTO test_order(description,cost)
    VALUES(&#39;test&#39;, -100.11);
    提示:
    [SQL]INSERT INTO test_order(description,cost)
    VALUES(&#39;test&#39;, -100.11)
    
    [Err] 1264 - Out of range value for column &#39;cost&#39; at row 1
    Copier après la connexion

    其它插入测试结论:

    当数值在其取值范围之内,小数位多了,则四舍五入后直接截断多出的小数位。

    若数值在其取值范围之外,则直接报Out of range value错误。

    【相关推荐:mysql视频教程

    Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal