ホームページ  >  記事  >  データベース  >  mysql データ型の分析例

mysql データ型の分析例

PHPz
PHPz転載
2023-06-01 23:38:021039ブラウズ

整数型

数値データ型は主に数値を保存するために使用されます。mysql はさまざまな数値データ型を提供します。異なるデータ型は異なる値の範囲を提供し、保存できるデータ型が大きいほど、値の範囲が広いほど、必要なストレージ容量が大きくなります。

mysql提供される主な整数型は、TINYINTSMALLINTMEDIUMINTINT です。 、BIGINT。整数型の属性フィールドでは、AUTO_INCREMENT自動インクリメント制約を追加できます。

次の 2 つの表を見てください;

  • 表 1: mysql

    ## の整数データ型
  • #表 2、

    mysqlさまざまな整数型の値の範囲

例:

year int(4);

このステートメントは、

year フィールドのデータが通常 4 桁のみを表示することを示します。幅;

注:表示幅はデータ型の値の範囲とは関係ありません。表示幅は表示できる数値の最大数を指定するだけで、指定した幅に満たない桁数の場合はスペースで埋められ、表示幅より大きい値を挿入した場合は値が続く限り、整数の型を超えない値の範囲内であれば、値を挿入して表示することができます。

: 値

12345year フィールドに挿入します。select を使用して列の値をクエリする場合, mysql は、4 桁の値ではなく、5 桁の完全な 12345 として表示されます。 他の整数データ型でも、テーブル構造を定義するときに必要な表示幅を指定できます。指定しない場合、システムは各型のデフォルトの幅を指定します。

整数型が異なれば、値の範囲も異なり、必要な記憶領域も異なります。したがって、実際のニーズに応じて最適な型を選択する必要があります。これにより、クエリの効率が向上し、記憶領域が節約されます。実際には、小数部のある数値を使用する必要がありますが、整数型には小数部は含まれません。次に10進数の型を紹介します。

注:
表示幅は表示のみに使用され、値の範囲や占有スペースを制限することはできません。

浮動小数点数型と固定小数点数型

浮動小数点数と固定小数点数は、mysql

で小数を表すために使用されます。

浮動小数点数には 2 つのタイプがあります:

単精度浮動小数点型 (FLOAT)
  • 倍精度浮動小数点型 (DOUBLE)
  • 固定小数点型は 1 つだけです:

DECIMAL
  • 浮動小数点数型と固定小数点数型の両方を (M, N) で表すことができます。このうち、
  • M

precision として使用し、 桁の合計数を表し、Nscale と呼ばれ、 10進数の桁数DECIMAL 型は

FLOAT

DOUBLE とは異なります。DECIMAL は実際には文字列として保存され、可能な最大値になります。値の範囲は DOUBLRE と同じですが、有効な値の範囲は MD の値によって決まります。どのように言って? M を変更し、

D

を固定すると、M が大きくなるにつれて値の範囲も大きくなります。 それでは、mysql では、浮動小数点型と固定小数点型の値の範囲はどのくらいになるのでしょうか?

値の範囲は次のとおりであるため、通常のビジネス条件でこれらを使い切ることはほとんど不可能です。

FLOAT type

値の範囲:

# 符号付き値の範囲:

-3.402823466E 38 ~-1.175494351E-38
  • 符号なし値の範囲:

    0 および 1.175494351E-38 ~3.402823466E 38
  • #DOUBLE

    タイプ
  • 値の範囲:

符号付き値の範囲:

-1.7976931348623157E 308 ~-2.2250738585072014E-308
  • 符号なし値の範囲:

    0 と 2.2250738585072014E-308~ 1.7976931348623157E 308
  • 注:
  • 固定小数点数型であっても、浮動小数点数型であっても、ユーザー指定の精度が精度の範囲を超える場合、丸められます。

少し混乱するかもしれません。例を示します。

データ テーブルを

yunweijia_1、フィールド タイプ # として作成します。 ## は次のとおりです;

mysql> create table yunweijia_1 (x float(5,1), y double(5,1), z decimal(5,1));
Query OK, 0 rows affected, 2 warnings (0.04 sec)
mysql>

次に、このテーブルにデータの一部を挿入します sqlステートメント は次のとおりです:

mysql> insert into yunweijia_1 values (6.66, 7.77, 8.888);
Query OK, 1 row affected, 1 warning (0.01 sec)
mysql>

上のプロンプト メッセージを見てください。insert ステートメントを実行すると、警告メッセージが表示されます。次に、警告メッセージが何であるかを見てみましょう。<pre class="brush:sql;">mysql&gt; show warnings; +-------+------+----------------------------------------+ | Level | Code | Message | +-------+------+----------------------------------------+ | Note | 1265 | Data truncated for column &amp;#39;z&amp;#39; at row 1 | +-------+------+----------------------------------------+ 1 row in set (0.00 sec) mysql&gt;</pre> は、次のことを確認できます。 z フィールドが挿入中に切り捨てられたが、

x

y

が切り捨てられたときに警告は表示されませんでした。 次に、結果を確認します: <blockquote><p>mysql> select * from yunweijia_1;<br>+------+------+------+<br>| x | y | z |<br>+------+------+------+<br>| 6.7 | 7.8 | 8.9 |<br>+------+------+------+<br>1 row in set (0.00 sec)<br>mysql></p></blockquote> <p>可以看到分别都进行了<strong>四舍五入</strong>,这点需要注意。</p> <p><code>FLOATDOUBLE在不指定精度操作时,默认会按照实际的精度(由计算机硬件和操作系统决定),DECIMAL若不指定精度则默认为(10,0);

浮点数相对于定点数的优点是在长度一定的情况下,浮点数能够表示更大的数据范围;他的缺点是会引起精度问题;

注意点:在mysql中,定点数以字符串形式存储,在对精度要求比较高的时候,使用DECIMAL的类型比较好,另外,两个浮点数进行减法和比较运算时,容易出现问题,所以在使用浮点数时需要注意,并尽量避免做浮点数比较。

日期与时间类型

mysql中有多种表示日期的数据类型,主要有:

  • DATETIME

  • DATE

  • TIMESTAMP

  • TIME

  • YEAR

比如说,当只记录年信息的时候,可以只使用YEAR类型,而没有必要使用DATE

每一个类型都有合法的取值范围,当指定确实不合法的值时系统将“零”值插入到数据库中。

YEAR

year类型是一个单字节类型,用于表示年,在存储时只需要1字节。可以使用各种格式指定year值,如下:

  • 1、以4位字符串或者4位数字格式表示的year,范围为1901~2155。输入格式为yyyy或者'yyyy',例如:输入‘2022’或者2022,插入到数据库的值均为2022。

  • 2、以2位字符串格式表示的year,范围为“00”到“99”。“00”~“69”和“70”~“99”范围的值分别被转换为“2022”~“2069”和“1970”~“1999”范围的year值。“0”与“00”的作用相同。插入超过取值范围的值将被转换成2000

  • 3、以两位数字表示的YEAR,范围为1~99。1~69和70~99范围的值分别被转换为200·~2069和1970~1999范围的YEAR

值。和字符相比较而言,这里的0值,将被转换成0000,而不是2000。

注意点:

两位整数范围与两位字符串范围稍有不同。例如,插入2000年,有人可能会使用数字格式的0表示year,实际上,插入数据库的值为0000,而不是所希望的2000。只有使用字符串格式的“0”或者“00”,才可以被正确的解释为2000,。非法YEAR值将被转换为0000。

栗子:

我们创建一个名为yunweijia_2的数据表,使用以下sql语句:

mysql> create table yunweijia_2 (y year);
Query OK, 0 rows affected (0.04 sec)
mysql>

然后我们往表中插入一条数据;

mysql> insert into yunweijia_2 values(2022), (&#39;2022&#39;);
Query OK, 2 rows affected (0.01 sec)
Records: 2 Duplicates: 0 Warnings: 0
mysql>

再次尝试插入一条数据;

mysql> insert into yunweijia_2 values (&#39;2166&#39;);
ERROR 1264 (22003): Out of range value for column &#39;y&#39; at row 1
mysql>

我们发现‘2166’超出了YEAR类型的取值范围,所以不能插入数据,这个时候我们看下mysql数据库中的数据;

mysql> select * from yunweijia_2;
+------+
| y |
+------+
| 2022 |
| 2022 |
+------+
2 rows in set (0.00 sec)
mysql>

栗子:

首先我们先删除yunweijia_2数据表中的数据;

mysql> delete from yunweijia_2;
Query OK, 2 rows affected (0.01 sec)
mysql>

可以看到提示删除了两条数据;

然后我们再插入以下数据;

mysql> insert into yunweijia_2 values (&#39;0&#39;), (&#39;00&#39;), (&#39;88&#39;), (&#39;22&#39;);
Query OK, 4 rows affected (0.01 sec)
Records: 4 Duplicates: 0 Warnings: 0
mysql>

然后看下结果是什么:

mysql> select * from yunweijia_2;
+------+
| y |
+------+
| 2000 |
| 2000 |
| 1988 |
| 2022 |
+------+
4 rows in set (0.00 sec)
mysql>

从上面i看到,字符串‘0’和‘00’的作用相同,分别都转换成了2000年;‘88’转换成了‘1988’;‘22’转换成了‘2022’。

栗子:

老规矩,先删除表中现有的数据;

mysql> delete from yunweijia_2;
Query OK, 4 rows affected (0.01 sec)
mysql>

然后再插入数据:

mysql> insert into yunweijia_2 values (0), (99), (22);
Query OK, 3 rows affected (0.01 sec)
Records: 3 Duplicates: 0 Warnings: 0
mysql>

看下结果:

mysql> select * from yunweijia_2;
+------+
| y |
+------+
| 0000 |
| 1999 |
| 2022 |
+------+
3 rows in set (0.00 sec)
mysql>

可以看到,0被转换成了0000,99被转换成了1999,22被转换成了2022。

TIME

time类型用在只需要时间信息的值,在存储时需要3字节,格式为HH:MM:SS

其中,HH表示小时,MM表示分钟,SS表示秒。

mysqltime类型的取值范围为-838:59:59~838:59:598,小时部分为什么会这么大呢,这是因为time类型不仅可以用来表示一天的时间,还可能是某个事件过去的时间或者两个事件之间的时间间隔。

(1)‘D HH:MM:S’格式的字符串,可以使用下面任何一种“非严格”的语法:

  • ‘HH:MM:SS’

  • ‘HH:MM’

  • ‘D HH:MM’

这里的D表示日,可以取0~34的值,在插入数据库时,D被转换成小时保存,格式为“D*24+HH”;

(2)‘HH:MM:SS’格式的、没有间隔符的字符串或者HHMMSS格式的数值,假定是有意义的时间。例如:'223344'被理解成‘22:33:44’,但是‘223366’是不合法的(他有一个没有意义的秒部分),存储时将变成00:00:00。

注意点:

time列分配简写时应该注意,如果没有冒号,mysql解释值时,假定最右边的两位表示秒。如果time值中使用了冒号,则肯定被单做是当天的时间。

例如:

11:22 会被mysql解释成 00:11:22

'11:22'会被mysql解释成11:22:00

栗子

创建一个名为yunweijia_3的数据表;

mysql> create table yunweijia_3(t time);
Query OK, 0 rows affected (0.03 sec)
mysql>

往这个表中插入数据:

mysql> insert into yunweijia_3 values (&#39;10:06:06&#39;), (&#39;22:22&#39;), (&#39;2 10:10&#39;), (&#39;3 00&#39;), (&#39;20&#39;);
Query OK, 5 rows affected (0.01 sec)
Records: 5 Duplicates: 0 Warnings: 0
mysql>

看下表中的数据:

mysql> select * from yunweijia_3;
+----------+
| t |
+----------+
| 10:06:06 |
| 22:22:00 |
| 58:10:00 |
| 72:00:00 |
| 00:00:20 |
+----------+
5 rows in set (0.00 sec)
mysql>

小提示:在使用‘D HH’格式时,小时一定要使用双位数值,如果是小于10的小时数,应在前面加0以用来补全双位数值。

举个栗子 :

首先我们删除数据表yunweijia_3里面的数据;

mysql> delete from yunweijia_3;
Query OK, 5 rows affected (0.01 sec)
mysql>

然后再表中插入数据:

mysql> insert into yunweijia_3 values (&#39;101112&#39;), (111213), (&#39;0&#39;);
Query OK, 3 rows affected (0.01 sec)
Records: 3 Duplicates: 0 Warnings: 0
mysql>

再次向表中插入一条数据;

mysql> insert into yunweijia_3 values (107010);
ERROR 1292 (22007): Incorrect time value: &#39;107010&#39; for column &#39;t&#39; at row 1
mysql>

可以看到这条数据没有插入成功,我看看下提示信息;

mysql> show warnings;
+-------+------+--------------------------------------------------------+
| Level | Code | Message |
+-------+------+--------------------------------------------------------+
| Error | 1292 | Incorrect time value: &#39;107010&#39; for column &#39;t&#39; at row 1 |
+-------+------+--------------------------------------------------------+
1 row in set (0.00 sec)
mysql>

为什么这次会插入失败呢,是不是因为我们的分钟应该是小于60的啊,但是这里是70,所以报错了。

我们查看下这个数据库中的数据现在的展示吧:

mysql> select * from yunweijia_3;
+----------+
| t |
+----------+
| 10:11:12 |
| 11:12:13 |
| 00:00:00 |
+----------+
3 rows in set (0.00 sec)
mysql>

又举个栗子:

我们还可以使用系统函数向time字段列插入值;

删除数据表yunweijia_3里面的数据;

mysql> delete from yunweijia_3;
Query OK, 3 rows affected (0.01 sec)
mysql>

然后在表中插入数据;

mysql> insert into yunweijia_3 values (CURRENT_TIME), (NOW());
Query OK, 2 rows affected (0.01 sec)
Records: 2 Duplicates: 0 Warnings: 0
mysql>

查看下数据库中的结果;

mysql> select * from yunweijia_3;
+----------+
| t |
+----------+
| 23:03:41 |
| 23:03:41 |
+----------+
2 rows in set (0.00 sec)

mysql>

从结果中可以看到,获取系统当前的日志插入到time类型的列中。

以上がmysql データ型の分析例の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はyisu.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。