set列类型的用法binary 和char的区别 mysql学习笔记:=================字符串:字符串可以用单引号或双引号引起来。字符串中的转义字符以'\'开始,如下:\0 ASCII 0(NUL)字符。 \' 单引号(‘'’)。 \" 双引号(‘"’)。 \b 退格符。 \n 换行符。 \r 回车符。 \t tab字符。 \Z ASCII 26(控制(Ctrl)-Z)。该字符可以编码为‘\Z’,以允许你解决在 Windows中ASCII 26代表文件结尾这一问题。(如果你试图使用mysql db_name < file_name,ASCII 26会带来问题)。 \\ 反斜线(‘\’)字符。 \% % \_ _转义字符对大小写敏感,\b’解释为退格,但‘\B’解释为‘B’。 在字符串内用‘"’引用的‘'’不需要特殊处理,不需要用双字符或转义。同样,在字符串内用‘'’引用的‘"’也不需要特殊处理。mysql> SELECT 'hello', '"hello"', '""hello""', 'hel''lo', '\'hello';+-------+---------+-----------+--------+--------+| hello | "hello" | ""hello"" | hel'lo | 'hello |+-------+---------+-----------+--------+--------+| hello | "hello" | ""hello"" | hel'lo | 'hello |+-------+---------+-----------+--------+--------+=================================十六进制值在数字上下文中,十六进制数如同整数。在字符串上下文,如同字符串,每对十六进制数字被转换为一个字符:十六进制值的默认类型是字符串。如果想要确保该值作为数字处理,可以使用CAST(...AS UNSIGNED):mysql> SELECT 0x41,0x41+10,CAST(0x41 AS UNSIGNED);+------+---------+------------------------+| 0x41 | 0x41+10 | CAST(0x41 AS UNSIGNED) |+------+---------+------------------------+| A | 75 | 65 |+------+---------+------------------------+ 可以用HEX()函数将一个字符串或数字转换为十六进制格式的字符串:mysql> select hex('rolia');+--------------+| hex('rolia') |+--------------+| 726F6C6961 |+--------------+===============================boolean类型MYSQL保存BOOLEAN值时用1代表TRUE,0代表FALSE,boolean在MySQL里的类型为tinyint(1),MySQL里有四个常量:true,false,TRUE,FALSE,它们分别代表1,0,1,0,mysql> select true,false,TRUE,FALSE;+------+-------+------+-------+| TRUE | FALSE | TRUE | FALSE |+------+-------+------+-------+| 1 | 0 | 1 | 0 |+------+-------+------+-------+可以如下插入boolean值:insert into [xxxx(xx)] values(true),当然也可以values(1);举例如下:mysql> alter table test add isOk boolean;Query OKmysql> desc test;+-------+-------------+------+-----+---------+----------------+| Field | Type | Null | Key | Default | Extra |+-------+-------------+------+-----+---------+----------------+| id | int(11) | NO | PRI | NULL | auto_increment || isOk | tinyint(1) | YES | | NULL | |+-------+-------------+------+-----+---------+----------------+mysql> insert into test(isOk) values(true);Query OKmysql> select isOk from test ;+------+| isOk |+------+| 1 |+------+=================位字段值BIT位字段值在MySQL里的类型为bit([n]),n为位数,不指定则为默认值1。mysql> create table t_bit(b bit(4));Query OK, 0 rows affected (0.44 sec)mysql> desc t_bit;+-------+--------+------+-----+---------+-------+| Field | Type | Null | Key | Default | Extra |+-------+--------+------+-----+---------+-------+| b | bit(4) | YES | | NULL | |+-------+--------+------+-----+---------+-------+插入时用b'value'符号写位字段值,value是一个用0和1写成的二进制值。mysql> insert into t_bit set b=b'101';查询时用函数bin([column]+0)进行查询。mysql> select bin(b+0) from t_bit;+----------+| bin(b+0) |+----------+| 100 || 101 |+----------+======================大小写敏感操作系统的大小写敏感性决定了数据库名和表名的大小写敏感性。大多数Unix中数据库名和表名对大小写敏感,而在Windows中对大小写不敏感。这样会导致操作数据库名和表名时出现不一致现象。在MySQL中如何在硬盘上保存和使用表名和数据库名由lower_case_tables_name系统变量确定,可以在启动mysqld时设置。lower_case_tables_name可以采用下面的任一值:值 含义 0 使用CREATE TABLE或CREATE DATABASE语句指定的大写和小写在硬盘上保存表名和数据库名。 称比较对大小写敏感。在Unix系统中的默认设置即如此。 请注意如果在大小写不敏感的文件系统上用--lower-case-table-names=0强制设为0, 并且使用不同的大小写访问MyISAM表名,会导致索引破坏。 1 表名在硬盘上以小写保存,名称比较对大小写敏感。 MySQL将所有表名转换为小写以便存储和查找。 该行为也适合数据库名和表的别名。 该值为Windows和Mac OS X系统中的默认值。 2 表名和数据库名在硬盘上使用CREATE TABLE或CREATE DATABASE语句指定的大小写进行保存, 但MySQL将它们转换为小写以便查找。名称比较对大小写敏感。 注释:只在对大小写不敏感的文件系统上适用! InnoDB表名以小写保存,例如lower_case_tables_name=1。想避免由于数据库或表名的大小写造成的数据转移问题,可使用两个选项:·在任何系统中可以使用lower_case_tables_name=1。使用该选项的不利之处是当使用SHOW TABLES或SHOW DATABASES时,看不出名字原来是用大写还是小写。·在Unix中使用lower_case_tables_name=0,在Windows中使用lower_case_tables_name=2。这样了可以保留数据库名和表名的大小写。不利之处是必须确保在Windows中查询总是用正确大小写引用数据库名和表名。 例外:如果你正使用InnoDB表,在任何平台上均应将lower_case_tables_name设置为1,以强制将名转换为小写。请注意在Unix中将lower_case_tables_name设置为1之前,重启mysqld之前,必须先将旧的数据库名和表名转换为小写。=====================系统变量查询方法有:select @@[xxx]select @@global.[xxx]select @@session.[xxx]show variablesshow global variablesshow session variables当你用SELECT @@var_name搜索一个变量时,MySQL返回SESSION值(如果存在),否则返回GLOBAL值。对于SHOW VARIABLES,如果不指定GLOBAL、SESSION或者LOCAL,MySQL返回SESSION值。设置方法同查询方法雷同set @@[scope].[xxx]=[value]如果设置变量时不指定GLOBAL、SESSION或者LOCAL,默认使用SESSION。========================注释MySQL有三种注释方法:1.从‘#’字符从行尾。2.从‘-- ’序列到行尾。请注意‘-- ’(双破折号)注释风格要求第2个破折号后面至少跟一个空格符(例如空格、tab、换行符等等)。3.从/*序列到后面的*/序列。结束序列不一定在同一行中,因此该语法允许注释跨越多行。===================字符集可以用SHOW CHARACTER SET语句查看当前版本的MYSQL所支持的字符集;character_set_system服务器用来保存识别符的字符集。该值一定是utf8,不可更改。default-character-set和default-collation设置服务器级别的字符集和校对规则;character_set_server和collation_server设置当前的服务器字符集和校对规则,运行时可以改变这些值;character_set_database和collation_database设置默认数据库的字符集和校对规则。无论何时默认数据库更改了,服务器都设置这两个变量的值。如果没有 默认数据库,这两个变量被设置为相应的服务器级别的变量(character_set_server和collation_server)。character_set_client设置客户端查询语句的字符集;character_set_connection设置从客户端的查询语句字符集要转换成什么字符集,服务器将客户端发送的查询从character_set_client系统变量转换到character_set_connection;character_set_results变量指示服务器返回查询结果到客户端使用的字符集。 default-character-set将成为一下几种设置的默认值:character_set_clientcharacter_set_connectioncharacter_set_databasecharacter_set_resultscharacter_set_server 有两个语句影响连接字符集:SET NAMES 'charset_name'SET CHARACTER SET charset_name SET NAMES 'x'语句与这三个语句等价:mysql> SET character_set_client = x;mysql> SET character_set_results = x;mysql> SET character_set_connection = x; SET CHARACTER SET x语句与这三个语句等价:mysql> SET character_set_client = x;mysql> SET character_set_results = x;mysql> SET collation_connection = @@collation_database; 每一个数据库有一个数据库字符集和一个数据库校对规则,它不能够为空。eg:CREATE DATABASE [db_name] DEFAULT CHARACTER SET [charset_name] COLLATE [collation_name]。如果两个都没有指定,则使用默认数据库的字符集和校对规则(character_set_database和 collation_database)。 每一个表有一个表字符集和一个校对规则,它不能为空。eg:CREATE TABLE tbl_name (column_list) DEFAULT CHARACTER SET [charset_name] COLLATE [collation_name]如果两个都没有指定,则使用数据库字符集和校对规则作为默认值(character_set_database和 collation_database)。 每一个“字符”列(即,CHAR、VARCHAR或TEXT类型的列)有一个列字符集和一个列 校对规则,它不能为空。eg:col_name {CHAR | VARCHAR | TEXT} (col_length) CHARACTER SET [charset_name] COLLATE [collation_name]如果两个都没有指定,则采用表字符集和校对规则。 ====================数值类型 各个整数类型存储的范围TINYINT1字节 -128~127 SMALLINT 2字节 -32768~ 32767 MEDIUMINT 3字节 -8388608~ 8388607INT 4字节 -2147483648~ 2147483647 BIGINT 8字节 -9223372036854775808~ 9223372036854775807 惯例:M 表示最大显示宽度。最大有效显示宽度是255。D 适用于浮点和定点类型,并表示小数点后面的位数。最大可能的值是30,但不应大于M-2。 方括号(‘[’和‘]’)表示可选部分。 BIT[(M)]位字段类型。M表示每个值的位数,范围为从1到64。如果M被省略, 默认为1。 BOOL,BOOLEAN是TINYINT(1)的同义词。zero值被视为假。非zero值视为真。 INT[(M)] [UNSIGNED] [ZEROFILL]普通大小的整数。带符号的范围是-2147483648到2147483647。无符号的范围是0到4294967295。M表示客显示宽度。用于显示宽度小于指定的列宽度的值时从左侧填满宽度。显示宽度并不限制可以在列内保存的值的范围,也不限制超过列的指定宽度的值的显示。如果实际值的宽度大于M,则原样显示或保存,如果宽度不大于M,则从左侧填满宽度M。 INTEGER[(M)] [UNSIGNED] [ZEROFILL]这是INT的同义词。 TINYINT[(M)] [UNSIGNED] [ZEROFILL]很小的整数。带符号的范围是-128到127。无符号的范围是0到255。 SMALLINT[(M)] [UNSIGNED] [ZEROFILL]小的整数。带符号的范围是-32768到32767。无符号的范围是0到65535。 MEDIUMINT[(M)] [UNSIGNED] [ZEROFILL]中等大小的整数。带符号的范围是-8388608到8388607。无符号的范围是0到16777215。 BIGINT[(M)] [UNSIGNED] [ZEROFILL]大整数。带符号的范围是-9223372036854775808到9223372036854775807。无符号的范围是0到18446744073709551615。 FLOAT[(M,D)] [UNSIGNED] [ZEROFILL]小(单精度)浮点数。允许的值是-3.402823466E+38到-1.175494351E-38、0和1.175494351E-38到3.402823466E+38。这些是理论限制,基于IEEE标准。实际的范围根据硬件或操作系统的不同可能稍微小些区别。(M,D)表示该值一共允许M位整数,其中D表示显示小数点后的位数。不足补0,超过则四舍五入。如:float(6,3);1234.12 ERROR:整数位最多3位。123.12 显示123.120123.456 显示123.46如果M和D被省略,根据硬件允许的限制来保存值。单精度浮点数精确到大约7位小数位。使用浮点数可能会遇到意想不到的问题,因为在MySQL中的所有计算用双精度完成。 DOUBLE[(M,D)] [UNSIGNED] [ZEROFILL]普通大小(双精度)浮点数。允许的值是-1.7976931348623157E+308到-2.2250738585072014E-308、0和2.2250738585072014E-308到 1.7976931348623157E+308。这些是理论限制,基于IEEE标准。实际的范围根据硬件或操作系统的不同可能稍微小些区别。。如果M和D被省略,根据硬件允许的限制来保存值。双精度浮点数精确到大约15位小数位。 DOUBLE PRECISION[(M,D)] [UNSIGNED] [ZEROFILL], REAL[(M,D)] [UNSIGNED] [ZEROFILL]为DOUBLE的同义词。 FLOAT(p) [UNSIGNED] [ZEROFILL]浮点数。p表示精度(以位数表示),但MySQL只使用该值来确定是否结果列的数据类型为FLOAT或DOUBLE。如果p为从0到24,数据类型变为没有M或D值的FLOAT。如果p为从25到53,数据类型变为没有M或D值的DOUBLE。结果列范围与本节前面描述的单精度FLOAT或双精度DOUBLE数据类型相同。 DECIMAL[(M[,D])] [UNSIGNED] [ZEROFILL]压缩的“严格”定点数。M是小数位数(精度)的总数,D是小数点(标度)后面的位数。小数点和(负数)的‘-’符号不包括在M中。如果D是0,则值没有小数点或分数部分。DECIMAL整数最大位数(M)为65。支持的十进制数的最大位数(D)是30。如果D被省略, 默认是0。如果M被省略, 默认是10。DECIMAL(M)等价于DECIMAL(M,0) NUMERIC[(M[,D])] [UNSIGNED] [ZEROFILL]同DECIMAL DEC[(M[,D])] [UNSIGNED] [ZEROFILL], NUMERIC[(M[,D])] [UNSIGNED] [ZEROFILL], FIXED[(M[,D])] [UNSIGNED] [ZEROFILL]是DECIMAL的同义词。 =====================================日期和时间类型 每个时间类型有一个有效值范围和一个“零”值,当指定不合法的MySQL不能表示的值时使用“零”值。TIMESTAMP类型有专有的自动更新特性。 MySQL使用以下规则解释两位年值:0-99范围的年值转换为1970-1999。00-69范围的年值转换为2000-2069。 日期总是以年-月-日顺序(例如,'98-09-04')。 当 MySQL遇到一个日期或时间类型的超出范围或对于该类型不合法的值时(如本节开始所描述),它将该值转换为该类的“零”值。一个例外是超出范围的TIME值被裁剪到TIME范围的相应端点。 各类“零”值的格式如下:列类型 “零”值DATETIME '0000-00-00 00:00:00'DATE '0000-00-00'TIMESTAMP 00000000000000TIME '00:00:00'YEAR 0000 “零”值是特殊值,你可以使用值0来保存或引用,写起来更容易。 insert into t1 set time_test=0 DATE日期。支持的范围为'1000-01-01'到'9999-12-31'。MySQL以'YYYY-MM-DD'格式显示DATE值 TIME时间。范围是'-838:59:59'到'838:59:59'。MySQL以'HH:MM:SS'格式显示TIME值当你只需要日期值而不需要时间部分时应使用DATE类型。MySQL用'YYYY-MM-DD'格式检索和显示DATE值。支持的范围是'1000-01-01'到 '9999-12-31'。 DATETIME日期和时间的组合。支持的范围是'1000-01-01 00:00:00'到'9999-12-31 23:59:59'。MySQL以'YYYY-MM-DD HH:MM:SS'格式显示DATETIME值当你需要同时包含日期和时间信息的值时则使用DATETIME类型。MySQL以'YYYY-MM-DD HH:MM:SS'格式检索和显示DATETIME值。支持的范围为'1000-01-01 00:00:00'到'9999-12-31 23:59:59'。(“支持”表示尽管先前的值可能工作,但没有保证)。 可以使用任何常见格式指定DATETIME、DATE和TIMESTAMP值:'YYYY-MM-DD HH:MM:SS'或'YY-MM-DD HH:MM:SS'格式的字符串。MM DD HH MM SS可以是单位数如2007-8-9 12:8:3'YYYY-MM-DD'或'YY-MM-DD'格式的字符串。 'YYYYMMDDHHMMSS'或'YYMMDDHHMMSS'格式的没有间割符的字符串。 YYYYMMDDHHMMSS或YYMMDDHHMMSS格式的数字。 'YYYYMMDD'或'YYMMDD'格式的没有间割符的字符串。 YYYYMMDD或YYMMDD格式的数字。 无效DATETIME、DATE或者TIMESTAMP值被转换为相应类型的“零”值('0000-00-00 00:00:00'、'0000-00-00'或者00000000000000)。 数字值应为6、8、12或者14位长。 如果一个数值是8或14位长,则假定为YYYYMMDD或YYYYMMDDHHMMSS格式。 如果数字 是6或12位长,则假定为YYMMDD或YYMMDDHHMMSS格式。 其它数字被解释为仿佛用零填充到了最近的长度。 尽管可以使用相同的格式指定DATETIME、DATE和TIMESTAMP值,不同类型的值的范围却不同。例如,TIMESTAMP值不能早于1970或晚于2037。 不同的时间值分配规则:DATE值分配给DATETIME或TIMESTAMP,结果值的时间部分被设置为'00:00:00'。DATETIME或TIMESTAMP值分配给DATE,结果值的时间部分被删除。 TIMESTAMP[(M)]范围是'1970-01-01 00:00:00'到2037年。TIMESTAMP列用于INSERT或UPDATE操作时记录日期和时间。关于timestamp 列的default属性:用DEFAULT CURRENT_TIMESTAMP和ON UPDATE CURRENT_TIMESTAMP子句,列为默认值使用当前的时间戳,并且自动更新。如:alter table table_test add ts timestamp default current_timestamp on update current_timestampdefault 和 on update 都不用和上面的相同。如:alter table table_test add ts timestamp只用DEFAULT CURRENT_TIMESTAMP,列为默认值使用当前的时间戳但是不自动更新。如:alter table table_test add ts timestamp default current_timestamp只用ON UPDATE CURRENT_TIMESTAMP子句,列有默认值0并自动更新。如:alter table table_test add ts timestamp on update current_timestamp可以用CURRENT_TIMESTAMP,也可以用NOW()。它们均具有相同的效果。default 和 on update 的顺序不重要。 一个表中定义的第一个timestamp的default 属性默认为 default current_timestamp on update current_timestamp其他的timestamp列的default 属性默认为 default 0 on update 0也可以通过分配一个NULL值,将TIMESTAMP列设置为当前的日期和时间。TIMESTAMP值返回后显示为'YYYY-MM-DD HH:MM:SS'格式的字符串,显示宽度固定为19个字符。如果想要获得数字值,应在TIMESTAMP 列添加+0。mysql> select ts+0 from test;+----------------+| ts+0 |+----------------+| 20071012121529 || 20071012121641 || 20071012121722 || 20071012121800 || 20071012121813 || 20071012121829 || 20071012122114 || 20071012122147 || 20071012122204 |+----------------+ YEAR[(2|4)]两位或四位格式的年。默认是四位格式。在四位格式中,允许的值是1901到2155和0000。在两位格式中,允许的值是70到69,表示从1970年到2069年。MySQL以YYYY 格式显示YEAR值 ========================字符串类型[NATIONAL] CHAR(M) [BINARY| ASCII | UNICODE]固定长度字符串,当保存时在右侧填充空格以达到指定的长度。M表示列长度。M的范围是0到255,如果不写则为默认值1。CHAR(0)列只占用一位,只可以取值NULL和''(空字符串)。 [NATIONAL] VARCHAR(M) [BINARY]变长字符串。M 表示最大列长度。M的范围是0到65,535。(VARCHAR的最大实际长度由最长的行的大小和使用的字符集确定。最大有效长度是65,532字节)。BINARY属性:带binary是用2进制保存 字符串比较的时候就是2进制串的比较 当然就区分大小写,不带binary是按字符集保存 有些区分大小写 有些不区分! BINARY(M)BINARY类型类似于CHAR类型,但保存二进制字节字符串而不是非二进制字符串。 VARBINARY(M)VARBINARY类型类似于VARCHAR类型,但保存二进制字节字符串而不是非二进制字符串。 BLOB[(M)]最大长度为65,535字节的BLOB列。可以给出该类型的可选长度M。如果给出,则MySQL将列创建为最小的但足以容纳M字节长的值的BLOB类型。 TINYBLOB最大长度为255字节的BLOB列。 MEDIUMBLOB最大长度为16,777,215字节的BLOB列。 LONGBLOB最大长度为4,294,967,295或4GB字节的BLOB列。LONGBLOB列的最大有效(允许的)长度取决于客户端/服务器协议中配置最大包大小和可用的内存。 TEXT[(M)]最大长度为65,535字符的TEXT列。可以给出可选长度M。则MySQL将列创建为最小的但足以容纳M字符长的值的TEXT类型。 TINYTEXT最大长度为255字符的TEXT列。 MEDIUMTEXT最大长度为16,777,215字符的TEXT列。 LONGTEXT最大长度为4,294,967,295或4GB字符的TEXT列。LONGTEXT列的最大有效(允许的)长度取决于客户端/服务器协议中配置最大包大小和可用的内存。 VARCHAR,BLOB和TEXT的比较一个VARCHAR(10)列能保存最大长度为10个字符的一个字符串,实际的存储需要是字符串的长度 ,加上1个字节以记录字符串的长度。对于字符串'abcd',L是4而存储要求是5个字节。BLOB和TEXT类型需要1,2,3或4个字节来记录列值的长度,这取决于类型的最大可能长度。VARCHAR需要定义大小,有255的最大限制;TEXT则不需要。如果你把一个超过列类型最大长度的值赋给一个BLOB或TEXT列,值被截断以适合它。4个TEXT类型TINYTEXT、TEXT、MEDIUMTEXT和LONGTEXT对应于4个BLOB类型,并且有同样的最大长度和存储需求。BLOB是一个能保存可变数量的数据的二进制的大对象。BLOB 可以储存图片,TEXT不行,TEXT只能储存纯文本文件。对BLOB值的排序和比较以大小写敏感方式执行,而对TEXT值是大小写不敏感的。 ENUM('value1','value2',...)枚举类型。只能有一个值的字符串,从值列'value1','value2',...,NULL中选出。ENUM列最多可以有65,535个截然不同的值。ENUM值在内部用整数表示。 SET('value1','value2',...)一个设置。字符串对象可以有零个或多个值,每个值必须来自列值'value1','value2',...SET列最多可以有64个成员。SET值在内部用整数表示。mysql> alter table test add set_test set('hello','how are you','fine');Query OK, 33 rows affected (0.80 sec)Records: 33 Duplicates: 0 Warnings: 0mysql> insert into test set set_test='hello';Query OK, 1 row affected (0.11 sec)mysql> insert into test set set_test='hello,fine';Query OK, 1 row affected (0.13 sec)mysql> select set_test from test;+------------+| set_test |+------------+| hello || hello,fine |+------------+ =======================

评论