MySql数据库的列类型(字段类型)
mysql字段写法

mysql字段写法在MySQL中,字段(column)是数据库表中的一个列。
以下是关于MySQL字段的一些常见写法:1.创建表时定义字段:sql复制代码CREATE TABLE表名 (字段1数据类型,字段2数据类型,...);例如,创建一个名为users的表,包含id、name和age三个字段:sql复制代码CREATE TABLE users (id INT,name VARCHAR(50),age INT);2.修改表时添加字段:sql复制代码ALTER TABLE表名ADD字段名数据类型;例如,向users表中添加一个名为email的字段:sql复制代码ALTER TABLE users ADD email VARCHAR(100);3.修改表时删除字段:sql复制代码ALTER TABLE表名DROP字段名;例如,从users表中删除email字段:sql复制代码ALTER TABLE users DROP email;4.修改字段的数据类型:sql复制代码ALTER TABLE表名 MODIFY 字段名新数据类型;例如,将users表中name字段的数据类型从VARCHAR(50)修改为TEXT:sql复制代码ALTER TABLE users MODIFY name TEXT;5.重命名字段:sql复制代码ALTER TABLE表名 RENAME 旧字段名TO新字段名;例如,将users表中name字段重命名为fullname:sql复制代码ALTER TABLE users RENAME name TO fullname;。
MySQL(二)数据库数据类型详解

MySQL(⼆)数据库数据类型详解 序⾔ 今天去健⾝了,感觉把⾝体练好还是不错的,闲话不多说,把这个数据库所遇到的数据类型今天统统在这⾥讲清楚了,以后在看到什么数据类型,咱度应该认识,下⾯就跟着我的节奏去把这个拿下吧。
---WZY⼀、数据类型 MySQL的数据类型有⼤概可以分为5种,分别是整数类型、浮点数类型和定点数类型、⽇期和时间类型、字符串类型、⼆进制类型。
现在可以来看看你对这5种类型的熟悉程度,哪个看起来懵逼了,那就说明⾃⼰哪个不熟悉,不理解。
注意:整数类型和浮点数类型可以统称为数值数据类型,这不难理解。
数值数据类型 整数类型:TINYINT、SMALLINT、MEDIUMINT、INT、BIGINT 浮点数类型:FLOAT、DOUBLE 定点⼩数:DECIMAL ⽇期/时间类型 YEAR、TIME、DATE、DATETIME、TIMESTAMP 字符串类型 CHAR、VARCHAR、TEXT、ENUM、SET等 ⼆进制类型 BIT、BINARY、VARBINARY、BLOB 1、整数类型 不管你学什么语⾔,在基础⽅⾯,都应该知道 1个字节= 8位⼆进制数。
每个类型的取值范围也就能够知道,⽐如TINYINT占⽤1个字节,也就是8位,2的8次⽅减1等于255,也就是说如果代表没符号的整数,该取值范围为0~255,如果是有符号的,最⾼位为符号号位,也就是2的7次⽅减1,也就是127,取值范围为-128~127,为什么需要减1,这个问题就需要考虑临界值的问题了。
⽽考虑临界值问题⼜有需要讨论原码补码反码的知识,这些度不是我们讨论的重点,所以在这就⾃⾏百度。
给出⼀张范围表,给⼤家做参考。
不同整数类型的取值范围 根据⾃⼰所需去选取不同的类型名称, 例如: CREATE TABLE aaa( id INT(10) PRIMARY KEY, age INT(6) ); 这个例⼦中INT(10)、INT(6) 括号中的数字表⽰的是该数据类型指定的显⽰宽度,指定能够显⽰的数值中数字的个数。
Mysql数据类型(字段)介绍

MySql数据库的列类型(字段类型)MySQL数据库的表是一个二维表,由一个或多个数据列构成。
每个数据列都有它的特定类型,该类型决定了MySQL如何看待该列数据,我们可以把整型数值存放到字符类型的列中,MySQL则会把它看成字符串来处理。
MySQL中的列类型有三种:数值类、字符串类和日期/时间类。
从大类来看列类型和数值类型一样,都是只有三种。
但每种列类型都还可细分。
下面对各种列类型进行详细介绍。
数值类的数据列类型数值型的列类型包括整型和浮点型两大类。
TINYINT:1字节非常小的正整数,带符号:-128~127,不带符号:0~255SMALLINT:2字节小整数,带符号:-32768~32767,不带符号:0~65535MEDIUMINT:3字节中等大小的整数,带符号:-8388608~8388607,不带符号:0~16777215INT:4字节标准整数,带符号:-2147483648~2147483647,不带符号:0~4294967295BIGINT:8字节大整数,带符号:-9223372036854775808~9233372036854775807,不带符号:0~18446744073709551615FLOAT:4字节单精度浮点数,最小非零值:+-1.175494351E-38,最大非零值:+-3.402823466E+38 DOUBLE:8字节双精度浮点数,最小非零值:+-2.2250738585072014E-308,最大非零值:+-1.7976931348623157E+308DECIMAL:M+2字节以字符串形式表示的浮点数,它的取值范围可变,由M和D的值决定。
整型数据列类型MySQL有五种整型数据列类型,即TINYINT,SMALLINT,MEDIUMINT,INT和BIGINT。
它们之间的区别是取值范围不同,存储空间也各不相同。
在整型数据列后加上UNSIGNED属性可以禁止负数,取值从0开始。
mysql字段类型详解

一个参数表示一个单精密浮点数字。
DOUBLE[(M,D)] [ZEROFILL]一个正常大小(双精密)浮点数字。
不能无符号。
允许的值是-1.7976931348623157E+308到-2.2250738585072014E-308、 0和2.2250738585072014E-308到1.7976931348623157E+308。
M是显示宽度而D是小数位数。
没有一个参数的 DOUBLE或FLOAT(X)(25 < = X < = 53)代表一个双精密浮点数字。
DOUBLE PRECISION[(M,D)] [ZEROFILL]REAL[(M,D)] [ZEROFILL]这些是DOUBLE同义词。
DECIMAL[(M[,D])] [ZEROFILL]一个未压缩(unpack)的浮点数字。
不能无符号。
行为如同一个CHAR列:“未压缩”意味着数字作为一个字符串被存储,值的每一位使用一个字符。
小数点,并且对于负数,“-”符号不在M中计算。
如果D是0,值将没有小数点或小数部分。
DECIMAL值的最大范围与DOUBLE相同,但是对一个给定的 DECIMAL列,实际的范围可以通过M和D的选择被限制。
如果D被省略,它被设置为0。
如果M被省掉,它被设置为10。
注意,在MySQL3.22 里,M参数包括符号和小数点。
NUMERIC(M,D) [ZEROFILL]这是DECIMAL的一个同义词。
DATE一个日期。
支持的范围是'1000-01-01'到'9999-12-31'。
MySQL以'YYYY-MM-DD'格式来显示DATE值,但是允许你使用字符串或数字把值赋给DATE列。
DATETIME一个日期和时间组合。
支持的范围是'1000-01-01 00:00:00'到'9999-12-31 23:59:59'。
MySQL以'YYYY-MM-DD HH:MM:SS'格式来显示DATETIME值,但是允许你使用字符串或数字把值赋给DATETIME的列。
mysql中数据类型N

mysql中数据类型N我们要把现实世界中的各种信息转换成计算机能理解的东西,这些转换后的信息就形成了数据。
例如,某⼈的出⽣⽇期是“1987年5⽉23⽇”,他的⾝⾼是170厘⽶,等等。
数据不仅包括数字、字母、⽂字和其他特殊字符组成的⽂本形式的数据,⽽且还包括图形、图像、动画、影像、声⾳等多媒体数据。
但使⽤最多、最基本的仍然是⽂本数据。
1. mysql的数据类型在mysql中有如下⼏种数据类型:(1)数值型数值是诸如32 或153.4 这样的值。
mysql ⽀持科学表⽰法,科学表⽰法由整数或浮点数后跟“e”或“e”、⼀个符号(“+”或“-”)和⼀个整数指数来表⽰。
1.24e+12 和23.47e-1 都是合法的科学表⽰法表⽰的数。
⽽1.24e12 不是合法的,因为指数前的符号未给出。
浮点数由整数部分、⼀个⼩数点和⼩数部分组成。
整数部分和⼩数部分可以分别为空,但不能同时为空。
数值前可放⼀个负号“-”以表⽰负值。
(2)字符(串)型字符型(也叫字符串型,简称串)是诸如“hello, world!”或“⼀个馒头引起的⾎案”这样的值,或者是电话号码87398413这样的值。
既可⽤单引号也可⽤双引号将串值括起来。
初学者往往分不清数值87398143和字符串87398143的区别。
都是数字啊,怎么⼀个要⽤数值型,⼀个要⽤字符型呢?关键就在于:数值型的87398143是要参与计算的,⽐如它是⾦融中的⼀个货款总额;⽽字符型的87398143是不参与计算的,只是表⽰电话号码,这样的还有街道号码、门牌号码等等,它们都不参与计算。
(3)⽇期和时间型⽇期和时间是⼀些诸如“2006-07-12”或“12:30:43”这样的值。
mysql还⽀持⽇期/时间的组合,如“2006-07-12 12:30:43”。
(4)null值null表⽰未知值。
⽐如填写表格中通讯地址不清楚留空不填写,这就是null值。
我们⽤create table语句创建⼀个表(参看前⾯的章节),这个表中包含列的定义。
MySQL数据库设计规范

MySQL数据库设计规范1、数据库命名规范采⽤26个英⽂字母(区分⼤⼩写)和0-9的⾃然数(经常不需要)加上下划线'_'组成;命名简洁明确(长度不能超过30个字符);例如:user, stat, log, 也可以wifi_user, wifi_stat, wifi_log给数据库加个前缀;除⾮是备份数据库可以加0-9的⾃然数:user_db_20151210;2、数据库表名命名规范采⽤26个英⽂字母(区分⼤⼩写)和0-9的⾃然数(经常不需要)加上下划线'_'组成;命名简洁明确,多个单词⽤下划线'_'分隔;例如:user_login, user_profile, user_detail, user_role, user_role_relation,user_role_right, user_role_right_relation表前缀'user_'可以有效的把相同关系的表显⽰在⼀起;3、数据库表字段名命名规范采⽤26个英⽂字母(区分⼤⼩写)和0-9的⾃然数(经常不需要)加上下划线'_'组成;命名简洁明确,多个单词⽤下划线'_'分隔;例如:user_login表字段 user_id, user_name, pass_word, eamil, tickit, status, mobile, add_time;每个表中必须有⾃增主键,add_time(默认系统时间)表与表之间的相关联字段名称要求尽可能的相同;4、数据库表字段类型规范⽤尽量少的存储空间来存数⼀个字段的数据;例如:能使⽤int就不要使⽤varchar、char,能⽤varchar(16)就不要使⽤varchar(256);IP地址最好使⽤int类型;固定长度的类型最好使⽤char,例如:邮编;能使⽤tinyint就不要使⽤smallint,int;最好给每个字段⼀个默认值,最好不能为null;5、数据库表索引规范命名简洁明确,例如:user_login表user_name字段的索引应为user_name_index唯⼀索引;为每个表创建⼀个主键索引;为每个表创建合理的索引;建⽴复合索引请慎重;6、简单熟悉数据库范式第⼀范式(1NF):字段值具有原⼦性,不能再分(所有关系型数据库系统都满⾜第⼀范式);例如:姓名字段,其中姓和名是⼀个整体,如果区分姓和名那么必须设⽴两个独⽴字段;第⼆范式(2NF):⼀个表必须有主键,即每⾏数据都能被唯⼀的区分;备注:必须先满⾜第⼀范式;第三范式(3NF):⼀个表中不能包涵其他相关表中⾮关键字段的信息,即数据表不能有沉余字段;备注:必须先满⾜第⼆范式;备注:往往我们在设计表中不能遵守第三范式,因为合理的沉余字段将会给我们减少join的查询;例如:相册表中会添加图⽚的点击数字段,在相册图⽚表中也会添加图⽚的点击数字段;MYSQL数据库设计原则1、核⼼原则不在数据库做运算;cpu计算务必移⾄业务层;控制列数量(字段少⽽精,字段数建议在20以内);平衡范式与冗余(效率优先;往往牺牲范式)拒绝3B(拒绝⼤sql语句:big sql、拒绝⼤事物:big transaction、拒绝⼤批量:big batch);2、字段类原则⽤好数值类型(⽤合适的字段类型节约空间);字符转化为数字(能转化的最好转化,同样节约空间、提⾼查询性能);避免使⽤NULL字段(NULL字段很难查询优化、NULL字段的索引需要额外空间、NULL字段的复合索引⽆效);少⽤text类型(尽量使⽤varchar代替text字段);3、索引类原则合理使⽤索引(改善查询,减慢更新,索引⼀定不是越多越好);字符字段必须建前缀索引;不在索引做列运算;innodb主键推荐使⽤⾃增列(主键建⽴聚簇索引,主键不应该被修改,字符串不应该做主键)(理解Innodb的索引保存结构就知道了);不⽤外键(由程序保证约束);4、sql类原则sql语句尽可能简单(⼀条sql只能在⼀个cpu运算,⼤语句拆⼩语句,减少锁时间,⼀条⼤sql可以堵死整个库);简单的事务;避免使⽤trig/func(触发器、函数不⽤客户端程序取⽽代之);不⽤select *(消耗cpu,io,内存,带宽,这种程序不具有扩展性);OR改写为IN(or的效率是n级别);OR改写为UNION(mysql的索引合并很弱智);select id from t where phone = ’159′ or name = ‘john’;=>select id from t where phone=’159′unionselect id from t where name=’jonh’避免负向%;慎⽤count(*);limit⾼效分页(limit越⼤,效率越低);使⽤union all替代union(union有去重开销);少⽤连接join;使⽤group by;请使⽤同类型⽐较;打散批量更新;5、性能分析⼯具show profile;mysqlsla;mysqldumpslow;explain;show slow log;show processlist;复制代码数据库的设计原则复制代码1. 原始单据与实体之间的关系 可以是⼀对⼀、⼀对多、多对多的关系。
一篇文章看懂mysql中varchar能存多少汉字、数字,以及varchar(100)和v。。。

⼀篇⽂章看懂mysql中varchar能存多少汉字、数字,以及varchar(100)和v。
看完这篇⽂章,你能搞清楚以下问题:1、varchar(100)和varchar(10)的区别在哪⾥?2、varchar能存多少汉字、数字?3、varchar的最⼤长度是多少呢?4、字符、字节、位,之间的关系?5、mysql字段类型存储需要多少字节?接下来请仔细看,整理不易啊。
1、varchar(100)和varchar(10)的区别在哪⾥?所以如果某些字段会涉及到⽂件排序或者基于磁盘的临时表时,分配VARCHAR数据类型时仍然不能够太过于慷慨。
还是要评估实际需要的长度,然后选择⼀个最长的字段来设置字符长度。
如果为了考虑冗余,可以留10%左右的字符长度。
千万不能认为其为根据实际长度来分配存储空间,⽽随意的分配长度,或者说⼲脆使⽤最⼤的字符长度。
----------------------------------char------------------------------------------1、从碎⽚⾓度进⾏考虑,使⽤CHAR字符型时,由于存储空间都是⼀次性分配的。
为此某个字段的内容,其都是存储在⼀起的。
单从这个⾓度来讲,其不存在碎⽚的困扰。
⽽可变长度的字符数据类型,其存储的长度是可变的。
当其更改前后数据长度不⼀致时,就不可避免的会出现碎⽚的问题。
故使⽤可变长度的字符型数据时,数据库管理员要时不时的对碎⽚进⾏整理。
如执⾏数据库导出导⼊作业,来消除碎⽚。
2、考虑其长度的是否相近,如果某个字段其长度虽然⽐较长,但是其长度总是近似的,如⼀般在90个到100个字符之间,甚⾄是相同的长度。
此时⽐较适合采⽤CHAR字符类型。
⽐较典型的应⽤就是MD5哈希值。
当利⽤MD5哈希值来存储⽤户密码时,就⾮常使⽤采⽤CHAR字符类型。
因为其长度是相同的。
另外,像⽤来存储⽤户的⾝份证号码等等,⼀般也建议使⽤CHAR类型的数据。
mysql中变量类型2222

mysql中变量类型MySQL支持大量的列类型,它可以被分为3类:数字类型、日期和时间类型以及字符串(字符)类型。
本节首先给出可用类型的一个概述,并且总结每个列类型的存储需求,然后提供每个类中的类型性质的更详细的描述。
概述有意简化,更详细的说明应该考虑到有关特定列类型的附加信息,例如你能为其指定值的允许格式。
由MySQL支持的列类型列在下面。
下列代码字母用于描述中:M指出最大的显示尺寸。
最大的合法的显示尺寸是 255 。
D适用于浮点类型并且指出跟随在十进制小数点后的数码的数量。
最大可能的值是30,但是应该不大于M-2。
方括号(“[”和“]”)指出可选的类型修饰符的部分。
注意,如果你指定一个了为ZEROFILL,MySQL将为该列自动地增加UNSIGNED属性。
TINYINT[(M)] [UNSIGNED] [ZEROFILL]一个很小的整数。
有符号的范围是-128到127,无符号的范围是0到255。
SMALLINT[(M)] [UNSIGNED] [ZEROFILL]一个小整数。
有符号的范围是-32768到32767,无符号的范围是0到65535。
MEDIUMINT[(M)] [UNSIGNED] [ZEROFILL]一个中等大小整数。
有符号的范围是-8388608到8388607,无符号的范围是0到16777215。
INT[(M)] [UNSIGNED] [ZEROFILL]一个正常大小整数。
有符号的范围是-2147483648到2147483647,无符号的范围是0到4294967295。
INTEGER[(M)] [UNSIGNED] [ZEROFILL]这是INT的一个同义词。
BIGINT[(M)] [UNSIGNED] [ZEROFILL]一个大整数。
有符号的范围是-9223372036854775808到9223372036854775807,无符号的范围是0到18446744073709551615。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
MySql数据库的列类型(字段类型)MySQL数据库的表是一个二维表,由一个或多个数据列构成。
每个数据列都有它的特定类型,该类型决定了MySQL如何看待该列数据,我们可以把整型数值存放到字符类型的列中,MySQL则会把它看成字符串来处理。
MySQL中的列类型有三种:数值类、字符串类和日期/时间类。
从大类来看列类型和数值类型一样,都是只有三种。
但每种列类型都还可细分。
下面对各种列类型进行详细介绍。
数值类的数据列类型数值型的列类型包括整型和浮点型两大类。
TINYINT:1字节非常小的正整数,带符号:-128~127,不带符号:0~255 SMALLINT:2字节小整数,带符号:-32768~32767,不带符号:0~65535 MEDIUMINT:3字节中等大小的整数,带符号:-8388608~8388607,不带符号:0~16777215 INT:4字节标准整数,带符号:-2147483648~2147483647,不带符号:0~4294967295 BIGINT:8字节大整数,带符号:-9223372036854775808~9233372036854775807,不带符号:0~18446744073709551615FLOAT:4字节单精度浮点数,最小非零值:+-1.175494351E-38,最大非零值:+-3.402823466E+38DOUBLE:8字节双精度浮点数,最小非零值:+-2.2250738585072014E-308,最大非零值:+-1.7976931348623157E+308DECIMAL:M+2字节以字符串形式表示的浮点数,它的取值范围可变,由M和D的值决定。
整型数据列类型MySQL有五种整型数据列类型,即TINYINT,SMALLINT,MEDIUMINT,INT和BIGINT。
它们之间的区别是取值范围不同,存储空间也各不相同。
在整型数据列后加上UNSIGNED属性可以禁止负数,取值从0开始。
声明整型数据列时,我们可以为它指定个显示宽度M(1~255),如INT(5),指定显示宽度为5个字符,如果没有给它指定显示宽度,MySQL会为它指定一个默认值。
显示宽度只用于显示,并不能限制取值范围和占用空间,如:INT(3)会占用4个字节的存储空间,并且允许的最大值也不会是999,而是INT整型所允许的最大值。
浮点型数据列类型MySQL有三种浮点型数据列类型,分别是:FLOAT,DOUBLE和DECIMAL。
浮点类数据类型有一个最大可表示值和一个最小非零可表示值,最小非零可表示值决定了该类型的精确度。
MySQL 4.0.2版之后,FLOAT和DOUBLE都可以指定UNSIGNED属性。
当指定该属性时,取值范围不平移到正数区间,而只是简单地把浮点类型的负数部份去掉。
浮点类型也有M(1~255)和D(1~30,且不能大于M-2)。
分别表示显示宽度和小数位数。
M和D在FLOAT和DOUBLE中是可选的,默认,当MySQL版本大于3.23.6时,FLOAT和DOUBLE类型将被保存为硬件所支持的最大精度。
DECIMAL的M和D值在MySQL3.23.6后可选,默认D值为0,M值为10。
如何选择数值类数据列类型?为了节省存储空间和提高数据库处理效率,我们应根据应用数据的取值范围来选择一个最适合的数据列类型。
如果把一个超出数据列取值范围的数存入该列,则MySQL就会截短该值,如:我们把99999存入SMALLINT(3)数据列里,因为SMALLINT(3)的取值范围是-32768~32767,所以就会被截短成32767存储。
显示宽度3不会影响数值的存储。
只影响显示。
对于浮点数据列,存入的数值会被该列定义的小数位进行四舍五入。
如把一个1.234存入FLOAT(6.1)数据列中,结果是1.2。
DECIMAL与FLOAT和DOUBLE的区别是:DECIMAL类型的值是以字符串的形式被储存起来的,它的小数位数是固定的。
它的优点是,不会象FLOAT和DOUBLE类型数据列那样进行四舍五入而产生误差,所以很适合用于财务计算;而它的缺点是:由于它的存储格式不同,CPU不能对它进行直接运算,从而影响运算效率。
DECIMAL(M,D)总共要占用M+2个字节。
数值类数据列的属性ZEROFILL属性适用于所有数值类数据列类型,作用是,如果数值的宽度小于定义的显示宽度,则在数值前填充0。
UNSIGNED属性不允许数据列出现负数。
AUTO_INCREMENT属性可生成独一无二的数字序列。
只对整数类的数据列有效。
NULL和NOT NULL属性设置数据列是否可为空。
DEFAULT属性可为数据列指定默认值。
//////////////////////////////////////////////////////字符串类数据列类型字符串可以用来表示任何一种值,所以它是最基本的类型之一。
我们可以用字符串类型来存储图象或声音之类的二进制数据,也可存储用gzip压缩的数据。
下表介绍了各种字符串类型:CHAR[(M)] M字节 M字节V ARCHAR[(M)] M字节 L+1字节TINYBLOD,TINYTEXT 2^8-1字节 L+1字节BLOB,TEXT 2^16-1字节 L+2MEDIUMBLOB,MEDIUMTEXT 2^24-1字节 L+3LONGBLOB,LONGTEXT 2^32-1字节 L+4ENUM('value1','value2',...) 65535个成员 1或2字节SET('value1','value2',...) 64个成员 1,2,3,4或8字节L+1、L+2是表示数据列是可变长度的,它占用的空间会根据数据行的增减面则改变。
数据行的总长度取决于存放在这些数据列里的数据值的长度。
L+1或L+2里多出来的字节是用来保存数据值的长度的。
在对长度可变的数据进行处理时,MySQL要把数据内容和数据长度都保存起来。
如果把超出字符串最大长度的数据放到字符类数据列中,MySQL会自动进行截短处理。
ENUM和SET类型的数据列定义里有一个列表,列表里的元素就是该数据列的合法取值。
如果试图把一个没有在列表里的值放到数据列里,它会被转换为空字符串(“”)。
字符串类型的值被保存为一组连续的字节序列,并会根据它们容纳的是二进制字符串还是非二进制字符而被区别对待为字节或者字符:二进制字符串被视为一个连续的字节序列,与字符集无关。
MySQL把BLOB数据列和带BINARY属性的CHAR和V ARCHAR数据列里的数据当作二进制值。
非二进制字符串被视为一个连续排列的字符序列。
与字符集有关。
MySQL把TEXT列与不带BINARY属性的CHAR和V ARCHAR数据列里的数据当作二进制值对待。
在MySQL4.1以后的版本中,不同的数据列可以使用不同的字符集。
在MySQL4.1版本以前,MySQL用服务器的字符集作为默认字符集。
非二进制字符串,即我们通常所说的字符串,是按字符在字符集中先后次序进行比较和排序的。
而二进制字符串因为与字符集无关,所以不以字符顺序排序,而是以字节的二进制值作为比较和排序的依据。
下面介绍两种字符串的比较方式:二进制字符串的比较方式是一个字节一个字节进行的,比较的依据是两个字节的二进制值。
也就是说它是区分大小写的,因为同一个字母的大小写的数值编码是不一样的。
非二进制字符串的比较方式是一个字符一个字符进行的,比较的依据是两个字符在字符集中的先后顺序。
在大多数字符集中,同一个字母的大小写往往有着相同的先后顺序,所以它不区分大小写。
二进制字符串与字符集无关,所以无论按字符计算还是按字节计算,二进制字符串的长度都是一样的。
所以V ARCHAR(20)并不表示它最多能容纳20个字符,而是表示它最多只能容纳可以用20个字节表示出来的字符。
对于单字节字符集,每个字符只占用一个字节,所以这两者的长度是一样的,但对于多字节字符集,它能容纳的字符个数肯定少于20个。
CHAR和V ARCHARCHAR和V ARCHAR是最常用的两种字符串类型,它们之间的区别是:CHAR是固定长度的,每个值占用相同的字节,不够的位数MySQL会在它的右边用空格字符补足。
V ARCHAR是一种可变长度的类型,每个值占用其刚好的字节数再加上一个用来记录其长度的字节即L+1字节。
CHAR(0)和V ARCHAR(0)都是合法的。
V ARCHAR(0)是从MySQL4.0.2版开始的。
它们的作用是作为占位符或用来表示各种on/off开关值。
如何选择CHAR和V ARCHAR,这里给出两个原则:如果数据都有相同的长度,选用VARCHAR会多占用空间,因为有一位用来存储其长度。
如果数据长短不一,选用V ARCHAR能节省存储空间。
而CHAR不论字符长短都需占用相同的空间,即使是空值也不例外。
如果长度出入不大,而且是使用MyISAM或ISAM类型的表,则用CHAR会比V ARCHAR 好,因为MyISAM和ISAM类型的表对处理固定长度的行的效率高。
在一个数据表里,只要有一个数据列的长度是可变的,则所有数据列的长度将是可变的。
MySQL会进行自动地转换。
一个例外,CHAR长度小于4的不会进行自动转换,因为MySQL 会认为这样做没必要,节省不了多少空间。
反而MySQL会把大量长度小的V ARCHAR转换成CHAR,以减少空间占用量。
BLOB和TEXTBLOB是二进制字符串,TEXT是非二进制字符串。
两者都可存放大容量的信息。
有关BLOB和TEXT索引的建立:BDB表类型和MySQL3.23.2以上版本的MyISAM表类型允许在BLOB和TEXT数据列上建立索引。
ISAM、HEAP和InnoDB表不支持大对象列的索引。
使用BLOB和TEXT应注意的问题:由于这两个列类型所存储的数据量大,所以删除和修改操作容易在数据表里产生大量的碎片,需定期运行OPTIMIZE TABLE以减少碎片和提高性能。
如果使用的值非常巨大,就需对服务器进行相应的优化调整,增加max_allowed_packet参数的值。
对那些可会用到变些巨大数据的客户程序,也需加大它们的数据包大小。
ENUM和SETENUM和SET都是比较特殊的字符串数据列类型,它们的取值范围是一个预先定义好的列表。
ENUM或SET数据列的取值只能从这个列表中进行选择。
ENUM和SET的主要区别是:ENUM只能取单值,它的数据列表是一个枚举集合。
它的合法取值列表最多允许有65535个成员。
例如:ENUM("N","Y")表示,该数据列的取值要么是"Y",要么就是"N"。