原文地址:http://blog.163.com/lijianwei_123/blog/static/1848928912011530113629775/
1、 VARCHAR,BLOB和TEXT类型是变长类型,对于其存储需求取决于列值的实际长度(在前面的表格中用L表示),而不是取决于类型的最大可能尺寸。例如,一个VARCHAR(10)列能保存最大长度为10个字符的一个字符串,实际的存储需要是字符串的长度 ,加上1个字节以记录字符串的长度。对于字符串'abcd',L是4而存储要求是5个字节。
2、CHAR,VARCHAR和TEXT的比较
数据的检索效率是:char>varchar>text
空间占用方面,要具体情况具体分析了。
CHAR
Char在保存的时候,后面(右边)会用空格填充到指定的长度,在检索的时候后面的空格会去掉,所以检索出来的数据需要再用什么trim之类的函数去处理。(与sql server可能有些不同)
Varchar在保存的时候,不进行填充。当值保存和检索时尾部的空格仍保留。
TEXT列不能有默认值,存储或检索过程中,不存在大小写转换.
当存储的字符超过他们定义的长度时候,如果不是在sql服务器的严格模式下,都会自动截取合适的字段存储,而不会出现错误。但是,如果是中文的话同样要报错误:)比如定义char(4),然后insert (‘c哈哈’).
注意一点的,Char,Varchar不像数值类型,有系统默认长度,所以必须在括号里定义长度,可以有默认值
text不可以写默认值,后面如果指定长度,不会报错误,但是这个长度是不起作用的,意思就是你插入数据的时候,超过你指定的长度还是可以正常插入(严格模式下没有测试 :))
存储计算:
在使用UTF8字符集的时候,手册上是这样描叙的:
· 基本拉丁字母、数字和标点符号使用一个字节。
· 大多数的欧洲和中东手写字母适合两个字节序列:扩展的拉丁字母(包括发音符号、长音符号、重音符号、低音符号和其它音符)、西里尔字母、希腊语、亚美尼亚语、希伯来语、阿拉伯语、叙利亚语和其它语言。
· 韩语、中文和日本象形文字使用三个字节序列。
char会造成空间浪费,但是有速度优势;而varchar节省了空间,但是速度就不如char。
- 经常变化的字段用varchar
- 知道固定长度的用char
- 尽量用varchar
- 超过255字节的只能用varchar或者text
- 能用varchar的地方不用text
2、CHAR,VARCHAR和TEXT的比较
数据的检索效率是:char>varchar>text
空间占用方面,要具体情况具体分析了。
CHAR
Char在保存的时候,后面(右边)会用空格填充到指定的长度,在检索的时候后面的空格会去掉,所以检索出来的数据需要再用什么trim之类的函数去处理。(与sql server可能有些不同)
Varchar在保存的时候,不进行填充。当值保存和检索时尾部的空格仍保留。
TEXT列不能有默认值,存储或检索过程中,不存在大小写转换.
当存储的字符超过他们定义的长度时候,如果不是在sql服务器的严格模式下,都会自动截取合适的字段存储,而不会出现错误。但是,如果是中文的话同样要报错误:)比如定义char(4),然后insert (‘c哈哈’).
注意一点的,Char,Varchar不像数值类型,有系统默认长度,所以必须在括号里定义长度,可以有默认值
text不可以写默认值,后面如果指定长度,不会报错误,但是这个长度是不起作用的,意思就是你插入数据的时候,超过你指定的长度还是可以正常插入(严格模式下没有测试 :))
存储计算:
在使用UTF8字符集的时候,手册上是这样描叙的:
· 基本拉丁字母、数字和标点符号使用一个字节。
· 大多数的欧洲和中东手写字母适合两个字节序列:扩展的拉丁字母(包括发音符号、长音符号、重音符号、低音符号和其它音符)、西里尔字母、希腊语、亚美尼亚语、希伯来语、阿拉伯语、叙利亚语和其它语言。
· 韩语、中文和日本象形文字使用三个字节序列。
char会造成空间浪费,但是有速度优势;而varchar节省了空间,但是速度就不如char。
- 经常变化的字段用varchar
- 知道固定长度的用char
- 尽量用varchar
- 超过255字节的只能用varchar或者text
- 能用varchar的地方不用text