日韩性视频-久久久蜜桃-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ò),歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 欧美做受高潮动漫 | 深夜成人在线观看 | 日韩欧美一二三区 | 色噜噜狠狠一区二区 | www.射 | 欧美一区二区三区久久精品 | 97成人精品视频在线观看 | 久久久久看片 | 亚洲五月网 | 欧洲在线一区 | 99在线精品免费视频 | 国产资源网站 | 国产偷自拍 | 国产尤物视频 | 亚洲aa | 天天夜夜骑 | 色综合自拍 | 日本一区二区黄色 | 欧美日一区二区 | 国产三级国产精品国产专区50 | 天天操,夜夜操 | 欧美日韩国产网站 | 中国av免费 | a级在线播放 | 久久99精品久久久久 | 日韩伦理一区二区 | 秋霞国产| juliaann精品艳妇hd | 亚洲乱码一区二区三区在线观看 | 天天做天天爱天天做 | 色噜噜狠狠狠综合曰曰曰88av | 亚洲国产精品视频在线 | 毛片毛片毛片毛片毛片毛片毛片毛片毛片毛片 | 亚洲午夜免费视频 | 色吧在线观看 | 爱爱15p| 手机在线看片福利 | 99热自拍偷拍 | 在线免费看91 | 懂色av一区二区三区在线播放 | 人人妻人人爽人人澡人人精品 | 日本国产精品一区 | 黄色一级免费看 | 毛片毛片女人毛片毛片 | 好男人天堂网 | 欧美精品在线一区二区 | 亚洲综合五月 | 亚洲性在线 | 四季av国产一区二区三区 | 久久伊人色 | 午夜免费一区二区 | 超碰在线资源 | 在线观看视频毛片 | www.欧美.com| 摸一摸操一操 | 久草三级| 中文字幕精品一二三四五六七八 | 久草黄色 | 四虎tv | 自拍视频网址 | 岛国av在线免费 | 亚洲精品久久久久avwww潮水 | 就去干成人网 | aaaaaaa毛片 | 国产欧美在线观看 | 欧美成人一区二免费视频软件 | 亚洲a级在线观看 | 日韩毛片在线播放 | 日本中文字幕在线视频 | 果冻传媒av| 久久久久免费 | 久久国产热视频 | 午夜影视体验区 | 日韩精品一区在线视频 | 免费在线看黄的网站 | 日韩av有码| 看免费黄色大片 | 欧美国产精品一区 | 中国妇女做爰视频 | 黄色网页在线 | 911精品国产一区二区在线 | 日本护士做爰视频 | 久久人妻少妇嫩草av蜜桃 | 午夜精品久久久久久久久久久久 | 国内精品久久久久久 | 亚洲丝袜在线观看 | 亚洲av成人精品日韩在线播放 | 91视频最新入口 | 精品一区二区三区电影 | 午夜精品久久久久久久 | 在线观看三级网站 | 国产成人二区 | 中文字幕免费在线看线人 | 国产精品免费视频一区二区 | 黑人专干日本人xxxx | www.97av | 视频在线观看一区二区 | 亚洲av无码一区二区三区性色 | 黄色天堂网站 |