日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

mysql里面integer默认宽度_MySQL中关于数据类型指定宽度之后的情况

發(fā)布時(shí)間:2025/3/12 数据库 11 豆豆
生活随笔 收集整理的這篇文章主要介紹了 mysql里面integer默认宽度_MySQL中关于数据类型指定宽度之后的情况 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

概述

MySQL有很多種數(shù)據(jù)類型,最常用的就是int,char,varchar,這些類型在創(chuàng)建表的時(shí)候都可以指定該字段的寬度,方法是在類型后面加一個(gè)括號(hào),括號(hào)中寫寬度就可以了。

但是,在指定寬度之后,有時(shí)候,我們可以看到插入的數(shù)據(jù)有一些被截?cái)嗔?#xff1b;有一些并沒有截?cái)?#xff0c;而是四舍五入了,甚至什么操作都沒有,原樣插入了。

下面對(duì)于每一種數(shù)據(jù)類型單獨(dú)測(cè)試:

數(shù)字型(int、tinyint...)

mysql> create table t (id int(5));

mysql> insert into t values(1234567),(123),(12345);

mysql> select * from t;

+---------+

| id |

+---------+

| 1234567 |

| 123 |

| 12345 |

+---------+

從上面的例子中可以看到,對(duì)于int而言,雖然指定了寬度,但是當(dāng)插入的數(shù)據(jù)寬度大于指定的寬度時(shí),并不會(huì)截?cái)唷?/p>

其實(shí)對(duì)于int而言,要指定寬度,那么就必定要指定zerofill,但同樣,zerofill只是在寬度不夠的時(shí)候用0填充,但是寬度大于指定寬度時(shí),數(shù)據(jù)仍然不會(huì)被截取。

mysql> create table t (id int(5) zerofill);

mysql> insert into t values(1234567),(123),(12345);

mysql> select * from t;

+---------+

| id |

+---------+

| 1234567 |

| 00123 |

| 12345 |

+---------+

字符串型(char、varchar)

mysql> create table t (fields_1 char(5),fields_2 varchar(5));

Query OK, 0 rows affected (0.01 sec)

mysql> insert into t values("123","123"),("12345","12345"),("1234567","1234567");

Query OK, 3 rows affected, 2 warnings (0.00 sec)

Records: 3 Duplicates: 0 Warnings: 2

mysql> show Warnings;

+---------+------+-----------------------------------------------+

| Level | Code | Message |

+---------+------+-----------------------------------------------+

| Warning | 1265 | Data truncated for column 'fields_1' at row 3 |

| Warning | 1265 | Data truncated for column 'fields_2' at row 3 |

+---------+------+-----------------------------------------------+

2 rows in set (0.00 sec)

mysql> select fields_1,length(fields_1),fields_2,length(fields_2) from t;

+----------+------------------+----------+------------------+

| fields_1 | length(fields_1) | fields_2 | length(fields_2) |

+----------+------------------+----------+------------------+

| 123 | 3 | 123 | 3 |

| 12345 | 5 | 12345 | 5 |

| 12345 | 5 | 12345 | 5 |

+----------+------------------+----------+------------------+

可以看到,對(duì)于char和varchar,如果制定了寬度,如果要插入的字符串的寬度超過了指定的寬度,則會(huì)截取掉超出的部分。

簡單來說,varchar的可變長度,這個(gè)可變,前提是存入的字符串長度不超過定義該字段時(shí)指定的長度,如果長度超過了指定長度,即使是可變長度字符串類型,數(shù)據(jù)仍會(huì)出現(xiàn)截?cái)唷?/p>

可以簡單記為:可縮不可擴(kuò)。

而固定長度的char類型,在存儲(chǔ)效率比varchar高,但是,會(huì)存在空間浪費(fèi)的情況,所以空間利用率沒有varchar高,而varchar是可變長度的,就意味著,在讀數(shù)據(jù)的時(shí)候,效率沒有char類型高,因?yàn)樵谧x數(shù)據(jù)的時(shí)候要判斷是否讀到結(jié)尾。

拓展1

前面已經(jīng)提到,對(duì)于數(shù)值類型的字段后面的寬度來說,只有在指定zerofill的時(shí)候,后面指定的寬度才有意義,否則,既不會(huì)出現(xiàn)截?cái)?#xff0c;也不會(huì)出現(xiàn)0填充。那么,不會(huì)出現(xiàn)截?cái)?#xff0c;是不是說,向一個(gè)int(5)字段的插入一個(gè)值,這個(gè)值是12345678912345678912345678...(由100位數(shù)字長度),那么還能存進(jìn)去嗎?

看下面示例:

mysql> create table t (id int(5) zerofill);

Query OK, 0 rows affected (0.10 sec)

mysql> insert into t values (9999999999999999999999999999999999999999999);

Query OK, 1 row affected, 2 warnings (0.00 sec)

mysql> show warnings;

+---------+------+---------------------------------------------+

| Level | Code | Message |

+---------+------+---------------------------------------------+

| Warning | 1264 | Out of range value for column 'id' at row 1 |

| Warning | 1264 | Out of range value for column 'id' at row 1 |

+---------+------+---------------------------------------------+

2 rows in set (0.00 sec)

mysql> select * from t;

+------------+

| id |

+------------+

| 4294967295 |

+------------+

1 row in set (0.00 sec)

可以從警告信息和執(zhí)行結(jié)果中看出,當(dāng)嘗試向指定寬度字段插入一個(gè)很大的數(shù)據(jù),大到遠(yuǎn)超該數(shù)據(jù)類型的上限,執(zhí)行雖然會(huì)出現(xiàn)警告,但是,數(shù)據(jù)確實(shí)插入了,只不過存儲(chǔ)的數(shù)據(jù)不是插入的數(shù)據(jù),而是存了一個(gè)該類型的最大值。

所以可以得出結(jié)論:對(duì)一個(gè)數(shù)字類型的字段而言,其數(shù)據(jù)類型已經(jīng)限定了它的數(shù)據(jù)范圍,當(dāng)嘗試插入一個(gè)超過數(shù)據(jù)范圍的值時(shí),會(huì)觸發(fā)警告,同時(shí),存入該數(shù)據(jù)類型的最大值。

拓展2

前面也提到了字符串(char和varchar)后面指定的寬度,這個(gè)寬度就不像數(shù)字類型的寬度了,因?yàn)?#xff0c;如果是字符串類型,那么,一旦超過字符串后面指定的寬度,那么一定會(huì)出現(xiàn)截?cái)唷?/p>

這里有個(gè)問題,字符串后面指定的寬度,比如char(5),varchar(5),這個(gè)5是指5個(gè)字符,還是指5個(gè)字節(jié)呢,或者說是5個(gè)bit(位)呢?

前面的示例中,很顯然看出,這個(gè)5不可能是bit(位),畢竟一個(gè)字節(jié)就有8位,在測(cè)試中,一個(gè)字符都插不進(jìn)去。

那么,要么是5個(gè)字符,或者5個(gè)字節(jié)。可能你會(huì)疑惑,5個(gè)字符和5個(gè)字節(jié)有什么區(qū)別嗎?abc,是3個(gè)字符,同時(shí)也是3個(gè)字節(jié),何必去區(qū)分呢?

那你想一下,咱們的漢字,一個(gè)漢字,經(jīng)過不同的編碼(GBK,GB2312,lantin1,UTF-8,UTF-8mb4)之后,所占的字節(jié)數(shù)是不一定相同的呀。

mysql> create table t (field char(5));

Query OK, 0 rows affected (0.40 sec)

mysql> show create table t\G

*************************** 1. row ***************************

Table: t

Create Table: CREATE TABLE `t` (

`field` char(5) DEFAULT NULL

) ENGINE=MyISAM DEFAULT CHARSET=latin1

1 row in set (0.00 sec)

mysql> insert into t values ('abcde');

Query OK, 1 row affected (0.00 sec)

mysql> insert into t values ('中國你好啊');

Query OK, 1 row affected, 2 warnings (0.00 sec)

mysql> show warnings;

+---------+------+-----------------------------------------------------------------------------------+

| Level | Code | Message |

+---------+------+-----------------------------------------------------------------------------------+

| Warning | 1300 | Invalid utf8 character string: 'D6D0B9' |

| Warning | 1366 | Incorrect string value: '\xD6\xD0\xB9\xFA\xC4\xE3...' for column 'field' at row 1 |

+---------+------+-----------------------------------------------------------------------------------+

2 rows in set (0.00 sec)

從上面的實(shí)例,很明顯可以看出答案,char(5)后面的5,是指的5字節(jié),而不是5個(gè)字符。

可以查看一下,存入的內(nèi)容是什么:

mysql> select * from t;

+-------+

| field |

+-------+

| abcde |

| ????? |

+-------+

2 rows in set (0.03 sec)

mysql> set names utf8;

Query OK, 0 rows affected (0.02 sec)

mysql> select * from t;

+-------+

| field |

+-------+

| abcde |

| ????? |

+-------+

2 rows in set (0.00 sec)

可以看出,后面雖然插入的“中國你好啊”,但是存的時(shí)候,已經(jīng)出現(xiàn)亂碼了,即使強(qiáng)制指定字符集,也是顯示亂碼。

咱們一般使用的都會(huì)utf8或者utf8mb4,可以在創(chuàng)建表格的時(shí)候,指定default charset=utf8。

拓展3

如果一個(gè)漢字使用某種編碼方式(比如utf8),在存儲(chǔ)的時(shí)候占3字節(jié),那么兩個(gè)漢字,就需要6個(gè)字節(jié)來存。

那么,如果char(5)類型的字段,能存入“中國”兩個(gè)字嗎?中國兩個(gè)字編碼之后是6字節(jié)。

首先解決一個(gè)問題:

mysql> create table t ( field char(5)) default charset=utf8;

Query OK, 0 rows affected (0.11 sec)

mysql> insert into t values ('abcde');

Query OK, 1 row affected (0.00 sec)

mysql> insert into t values ('中');

Query OK, 1 row affected, 2 warnings (0.00 sec)

mysql> show warnings;

+---------+------+----------------------------------------------------------------+

| Level | Code | Message |

+---------+------+----------------------------------------------------------------+

| Warning | 1300 | Invalid utf8 character string: 'D6D0' |

| Warning | 1366 | Incorrect string value: '\xD6\xD0' for column 'field' at row 1 |

+---------+------+----------------------------------------------------------------+

2 rows in set (0.00 sec)

mysql> select * from t;

+-------+

| field |

+-------+

| abcde |

| |

+-------+

2 rows in set (0.00 sec)

mysql> set names utf8;

Query OK, 0 rows affected (0.00 sec)

mysql> select * from t;

+-------+

| field |

+-------+

| abcde |

| |

+-------+

2 rows in set (0.00 sec)

可以看到,即使單個(gè)漢字“中”編碼之后3字節(jié)(未超過5字節(jié)范圍,仍舊未存入),這時(shí)可以看一下數(shù)據(jù)庫的字符集:

mysql> show variables like '%char%';

+--------------------------+-----------------------------------+

| Variable_name | Value |

+--------------------------+-----------------------------------+

| character_set_client | utf8 |

| character_set_connection | utf8 |

| character_set_database | latin1 |

| character_set_filesystem | binary |

| character_set_results | utf8 |

| character_set_server | utf8 |

| character_set_system | utf8 |

| character_sets_dir | E:\phpStudy\MySQL\share\charsets\ |

+--------------------------+-----------------------------------+

8 rows in set (0.00 sec)

可以看到,character_set_database設(shè)定的還是latin1字符集編碼,可以使用下面的命令修改:

set character_set_database='utf8';

接下來,測(cè)試過程中,即使插入單獨(dú)的一個(gè)漢字,也會(huì)出現(xiàn)警告,并且查看插入的值,只出現(xiàn)一個(gè)?或者一些亂碼,甚至沒有值(空的)。

我嘗試在php中執(zhí)行插入和查看操作:

$mysqli = new Mysqli();

$mysqli->connect("localhost","root","root","test");

$mysqli->set_charset("utf8");

$mysqli->query("truncate table t");

$mysqli->query("insert into t values ('abcde')");

$mysqli->query("insert into t values ('你')");

$mysqli->query("insert into t values ('你好')");

$sql = "select * from t";

$mysqli_result = $mysqli->query($sql);

$res = $mysqli_result->fetch_all();//一次性去的所有數(shù)據(jù)

print_r($res);

執(zhí)行之后,結(jié)果如下:

λ php index.php

Array

(

[0] => Array

(

[0] => abcde

)

[1] => Array

(

[0] => ?

)

[2] => Array

(

[0] => ???

)

)

至于為什么會(huì)這樣,現(xiàn)在還沒找到問題根源。之前好像也沒遇到過這種情況呀,等有時(shí)間在其他機(jī)器上試一下。

總結(jié)

以上是生活随笔為你收集整理的mysql里面integer默认宽度_MySQL中关于数据类型指定宽度之后的情况的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 羞羞答答一区 | 插入综合网 | 黑人一级片| av在线三区 | 国产最新在线 | 午夜精品视频在线观看 | 美日韩在线观看 | 日韩精品在线观看免费 | 久久国产精品免费视频 | a级在线观看网站 | 嫩草影院懂你的影院 | 日韩欧美视频在线播放 | 老司机在线永久免费观看 | 日韩最新视频 | av不卡在线观看 | 国产aⅴ片 | 爱情岛论坛亚洲线路一 | 神马午夜在线 | 国产一级黄色片子 | 日韩精品tv | 日本肉体xxxx裸体137大胆图 | 五月婷婷视频在线 | 亚洲一级视频在线观看 | 男女午夜视频 | 日本高清免费不卡视频 | 亚洲色图欧美在线 | 在线观看一级片 | 日韩网站在线播放 | 日韩中文字幕电影 | 影音先锋成人 | 日本三不卡 | 美女xx00| 日韩一区二区高清 | 91福利片| 国产黄视频在线观看 | 奇米777色| 色呦呦在线 | 岛国av免费在线观看 | 熟女性饥渴一区二区三区 | 少妇全黄性生交片 | 亚洲另类在线观看 | 国产精品主播 | 中文国产视频 | 男生操女生逼逼 | 国产三级视频在线 | 一二三区在线 | 最新av观看| 亚洲最大福利视频 | 亚洲三级在线免费观看 | 亚洲欧洲精品一区二区 | 二区中文字幕 | 91视频你懂的 | 日韩精品高清视频 | 黄色小说网站在线观看 | 五月天欧美 | 1515hh成人免费看 | 亚洲图片欧美色图 | h在线网站 | 夜夜爽夜夜叫夜夜高潮漏水 | 在线观看国产福利 | 国产精品成人3p一区二区三区 | 69视频在线免费观看 | 高清乱码免费网 | 久久久黄色片 | 一区视频在线播放 | 亚洲av首页在线 | 亚洲天堂网一区二区 | 精品久久9999 | 中文字幕一区二区三区手机版 | 日韩免费成人av | 毛片一二三区 | 日本不卡二区 | 性久久久久久久 | 丰满人妻一区二区三区免费视频棣 | 成人福利在线 | 又大又硬又爽免费视频 | 亚洲成人欧美 | 国产在线拍揄自揄拍无码 | 婷婷av一区二区三区 | 综合亚洲视频 | 91av久久久 | 超碰97免费| 亚洲综合日韩精品欧美综合区 | 国产精品久久久久9999 | 日韩一级二级三级 | 欧美激情一区二区视频 | 日本一二三区在线 | 国产成人精品一区二三区 | 国产又粗又猛又色 | 蜜桃臀一区二区三区 | 国产激情视频一区二区 | 午夜精品小视频 | 久草三级 | 国产粉嫩在线观看 | 久久久999精品视频 国产在线xx | 国产精品麻豆成人av电影艾秋 | 亚洲欧美伦理 | 狠狠操导航 | 亚洲射射|