mysql数据类型

一般来说,一个页内可以存放尽可能多的行,那么数据库的性能就越好。而且选择错误的数据类型,会加大后期数据库维护成本。

UNSIGNED属性就是将数字类型无符号化。

help int;

select f1 - f2 from t1;-- mysql对unsigned数的操作,返回都是unsigned,除非调节SQL_MODE设置

尽量不要unsigned, 除非zerofill, 若int存不了, 就用bigint

-- ---------------------------------------------

zerofill  -- 一旦启用ZEROFILL属性,mysql为列自动添加UNSIGNED属性。

zerofill只是在查询时的格式化输出(如果宽度小于设定的宽度,则自动填充0), 数据库内部存储的还是1而不是0001

select a,HEX(a) from t\G;

int(11) 若无zerofill, 这个11毫无作用,int整形是4字节

alter talbe t1 modify f1 int(4) zerofill;

-- ---------------------------------------------

sql mode

sql mode的严格模式为MySQL提供了很好的数据校验功能, 保证了数据的准确性,尽量不要默认(空)。

show variables like ‘%sql_mode%’;  -- sql_mode有global和session会话

select @@sql_mode;

set sql_mode = ‘‘;  -- sql_mode可以设置的选项有很多,一般最好设成严格模式

set sql_mode = ‘traditional‘;

-- ---------------------------------------------

default默认值, 默认为null, 当没有给某字段显式赋值时, 就用这个值

not null即值不能为null

-- ---------------------------------------------

auto_increment

一张表中最多一个, 没有也可没有

必须是索引(key), 一般为主键索引

select last_insert_id(); -- 取自动增长列的值

重置:

alter table user auto_increment = 1;

-- 还有一些其他参数可以设置步长以及初始值

-- ---------------------------------------------

整型:tinyint 1B 、smallint 2B 、mediumint 3B 、int 4B 、bigint 8B。

位类型:BIT

关于数字的经典SQl编程问题:1、数字辅助表,2、连续范围问题。

-- ---------------------------------------------

高精度类型:

decimal 和 numeric基本相同,最大位数是65。可应用于存钱。

salary dec(5, 1)

最多5位数, 其中一定1位小数, 整数位最多4位,  5为精度, 1为标度,会4舍5入

-- ---------------------------------------------

float  -- 表达小数

where score = 3.14; -- 有问题

float(6, 2)

double precision

-- ---------------------------------------------

字符串型

国际化公司, 需要存储的字符是多种多样的, 因此要使用unicode编码的字符集如utf8

unicode是一种编码方式

mysql>show charset;

utf8是一种字符集, 是一种存储格式

utf即unicode translation format, 即把unicode编码的字符转成某种格式来存储

utf8字符集中, 一个汉字占2 ~ 4个字节, 绝大部分占3个字节, 极少数占2个或4个字节

gb2312汉字均占2个字节,gbk是gb2312的超集。

一般对于跨国性业务,最初字符集最好采用utf8,解决移植开发兼容性问题。

-- ---------------------------------------------

char

show variables like ‘%char%‘;

char(8)存‘ab‘, 占8B, insert ‘ab‘, 存储时会在ab后补6个空格, select取出时会去掉空格

8个英文或中文字符

-- ---------------------------------------------

varchar(8)存的是‘ab‘, 占3B -- 存储时需要在前缀长度列表加上实际存储的字符,占1~2字节。

8个英文或中文字符

个人简介、微博内容, 文字量不是特别大就可用varchar而不用text,有些存储引擎会将大的varchar类型字符串自动转化为text或blob类型。

select length(‘中国人‘);

一般用varchar类型因为char类型长度是固定分配的。

-- ---------------------------------------------

binary和varbinary存储二进制的字符串。binary(N)等N代表的是字节数,而char(N)等N代表的是字符长度,另外char和varchar字符比较的是本身存储的字符,忽略字符后的填充字符,而对binary和varbinary来说,按二进制值来比较。最后对于binary字符串,其填充字符是0x00,char是0x20,0x00比较的是最小字符。

-- ---------------------------------------------

text、blob, 不能有默认值,创建索引时指定前缀长度以及排序时只使用列的前max_sort_length个字节

text 存大量文字如新闻内容, 不区分大小写

blob(large binary object), 区分大小写

-- ---------------------------------------------

enum(enumeration)和set类型都是集合类型,不同的是enum最多可枚举65535个元素 适用user表

,一次只能选一个成员,而set类型最多枚举64个元素。enum结合SQL_MODE严格模式约束,有用!

性别男女, 权限有没有, 是否管理员, 是否热点新闻,

enum类型只能从成员当中选择一个,而set 类型可以选择多个,

enum用法:那么对于多个值当中选取一个的话,可以选择enum类型,比如,性别(男女)二选一

set  类型用法:比如个人爱好,可以选择多个,那么这个使用我们用set类型

sex enum(‘M‘, ‘F‘)

-- ---------------------------------------------

日期时间型:(mysql对日期和时间的设置非常宽松)

datetime  8B 、DATE 3B 、timestamp 4B 、year  1B 、 time 3B  

值用‘‘引起

datetime和timestamp显示结果一样,占字节不同,以及实际存储内容datetime可以到当前时间的毫秒数,另外在建表时timestamp类型可以设置一个默认值而datetime不行(必须对表操作,即有改动),而且timestamp会自动更新当前时间。

datetime类型表示的时间范围比timestamp的类型要大,因此,需要时间范围比较大的选择datetime类型比较合适,

timestamp类型的时间是根据时区来选择的,如果需要显示的时间与时区对应,那么选择timestamp类型。

mysql 5.6.4版本后支持秒的小数部分:type_name(fsp)。mysql类型不精确到微妙不过可以用microsecond函数提取

select now();

curdate() date(now());

curtime() time(now());

now、current_timestamp和sysdate都用于返回当前系统时间,不过前两者返回的是执行SQL语句时的时间,而sysdate函数是返回执行当前函数时的时间。

时间加减函数有date_add和date_sub。date_format函数(防止误使用)是按用户需求格式化打印日期。

日期经典sql编程问题:1、生日问题,2、重叠问题,3、星期数问题。

WEEKDAY函数返返回值是0~6,0为monday,DAYOFWEEK函数返回值是1~7,1代表sunday。


-- ----------------------------------------------------------------

字符集

字符(character)是指人类语言中最小的表义符号, 例如‘a‘、‘b‘等

给定一系列字符, 对每个字符赋予一个数值

用数值来代表对应的字符, 这一数值就是字符的编码(encoding)

例如, 我们给字符‘a‘赋予数值0, 给字符‘b‘赋予数值1

则0就是字符‘a‘的编码, 1就是字符‘b‘的编码

给定一系列字符并赋予对应的数值编码后

所有这些字符和编码对组成的集合就是字符集(character set)

例如, 给定字符集合为{‘a‘, ‘b‘}时, {‘a‘:0, ‘b‘:1}就是一个字符集

os有字符集, 软件有字符集, 若软件无字符集则使用os的字符集

校对规则(collation), 也叫字符序, 是指在同一字符集内字符之间的比较规则

确定字符序后, 才能在一个字符集上定义什么是等价的字符, 以及字符之间的大小关系

区分大小写是一种顺序, 不区分大小写是一种顺序

一个字符集可以对应多种字符序, 其中有一个是默认字符序

每个字符序唯一对应一种字符集

             _ci  不区分大小写  -- 应用程序有这需求,不过建唯一索引会出错

排序规则   :_cs  区分大小写

             _bin 按编码值比较

对于国际化公司, 需要存储的字符是多种多样的, 因此要使用unicode编码的字符集如utf8

unicode是一种编码方式, 而utf8是一种存储方式

utf是unicode translation format, 即把unicode转成某种格式的意思

查看所有可用的字符集

show charset;

int、decimal不能指字符集

char、varchar、text字符串数据类型才可指

校对规则:  -- 没指定校对规则, 则使用该字符集默认的校对规则

show collation;

字符集与校对规则有4个级别的设置

server

db

table

column

[mysqld]

character_set_server=utf8   -- mysql5.5开始移除了default-character-set参数,取而代之为default-character-server。

==

create database ds charset=gbk;

alter database ds charset=utf8; -- 只对新创建的表有效

alter table emp charset = utf8;

客户端字符集:

default-character-set=utf8; #相当于set names utf8; --set names可以更改当前会话连接的字符集、当前会话的客户端的字符集以及当前会话返回集的字符集,mysql>status; 可看!

[mysql]

写入数据前, 查看数据前先设置客户端字符集, 即set names utf8;


本文出自 “8430296” 博客,请务必保留此出处http://8440296.blog.51cto.com/8430296/1584573

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。