<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
<channel>
<title><![CDATA[向东博客 专注WEB应用 构架之美 --- 构架之美，在于尽态极妍 | 应用之美，在于药到病除]]></title> 
<link>https://jackxiang.com/index.php</link> 
<description><![CDATA[赢在IT，Playin' with IT,Focus on Killer Application,Marketing Meets Technology.]]></description> 
<language>zh-cn</language> 
<copyright><![CDATA[向东博客 专注WEB应用 构架之美 --- 构架之美，在于尽态极妍 | 应用之美，在于药到病除]]></copyright>
<item>
<link>https://jackxiang.com/post//</link>
<title><![CDATA[mysql char(4)指的是四个字符，还是4个字节？ ]]></title> 
<author>jack &lt;xdy108@126.com&gt;</author>
<category><![CDATA[WEB2.0]]></category>
<pubDate>Tue, 04 Aug 2009 06:07:37 +0000</pubDate> 
<guid>https://jackxiang.com/post//</guid> 
<description>
<![CDATA[ 
	4个字符<br/><br/>字符串的长度：<br/>长度的单位为字符。一个多字节字符算作一个单字符。<br/><br/>MySQL字符串函数：<br/>对于一个包含五个二字节字符集, LENGTH()返回值为 10, 而CHAR_LENGTH()的返回值为5。<br/><br/>也就是说：<br/>对于一个汉字和一个字母都是一个字符。遵循CHAR和VARCHAR定义规范。也与数据库本身设置的字符集有关。<br/><br/>mysql的char和varchar字段不区分unicode还是别的什么编码，统统按照ascii来存，所以一个汉字占用2个字节。<br/><br/>CHAR和VARCHAR类型类似，但它们保存和检索的方式不同。它们的最大长度和是否尾部空格被保留等方面也不同。在存储或检索过程中不进行大小写转换。<br/><br/>CHAR和VARCHAR类型声明的长度表示你想要保存的最大字符数。例如，CHAR(30)可以占用30个字符。<br/><br/>CHAR列的长度固定为创建表时声明的长度。长度可以为从0到255的任何值。当保存CHAR值时，在它们的右边填充空格以达到指定的长度。当检索到CHAR值时，尾部的空格被删除掉。在存储或检索过程中不进行大小写转换。<br/><br/>VARCHAR列中的值为可变长字符串。长度可以指定为0到65,535之间的值。(VARCHAR的最大有效长度由最大行大小和使用的字符集确定。整体最大长度是65,532字节）。<br/><br/>char是定长字符数据,所谓定长就是长度固定的，当输入的数据长度没有达到指定的长度时将自动以英文空格在其后面填充，使长度达到相应的长度。<br/>CHAR是固定字符数量，储存时不足部分用空格补齐，搜起来比较快，占用空间相对就多<br/>VARCHAR是不固定字符数量，占用空间小，不过需要记录字符数。<br/>char是一种固定长度的类型，varchar则是一种可变长度的类型，它们的区别是：<br/><br/>　　char(M)类型的数据列里，每个值都占用M个字节，如果某个长度小于M，MySQL就会在它的右边用空格字符补足．（在检索操作中那些填补出来的空格字符将被去掉）在varchar(M)类型的数据列里，每个值只占用刚好够用的字节再加上一个用来记录其长度的字节（即总长度为L+1字节）．<br/><br/>使用的一般规则：<br/><br/>1.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;经常变化的字段用char<br/><br/>2.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;知道固定长度的用char<br/><br/>3.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;尽量用varchar<br/><br/>4.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;超过255字节的只能用varchar或者text<br/><br/>5.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;能用varchar的地方不用text<br/><br/><br/><br/><br/>一、演变：<br/><br/>MySQL数据库的varchar类型在5.0.3以下的版本中的最大长度限制为255，其数据范围可以是0~255。<br/><br/>在MySQL5.0.3及以上的版本中，varchar数据类型的长度支持到了65535，也就是说可以存放65532个字节的数据，起始位和结束位占去了3个字节，也就是说，在5.0.3以下版本中需要使用固定的TEXT或BLOB格式存放的数据可以在高版本中使用可变长的varchar来存放，这样就能有效的减少数据库文件的大小。<br/><br/>如果在varchar中写入大于设定的长度，默认情况下会截去后面的部分。<br/><br/><br/>二、详解(MySQL5.1)：<br/><br/>CHAR和VARCHAR类型类似，但它们保存和检索的方式不同。它们的最大长度和是否尾部空格被保留等方面也不同。在存储或检索过程中不进行大小写转换。<br/><br/>CHAR和VARCHAR类型声明的长度表示你想要保存的最大字符数。例如，CHAR(30)可以占用30个字符。<br/><br/>CHAR列的长度固定为创建表时声明的长度。长度可以为从0到255的任何值。当保存CHAR值时，在它们的右边填充空格以达到指定的长度。当检索到CHAR值时，尾部的空格被删除掉。在存储或检索过程中不进行大小写转换。<br/><br/>VARCHAR列中的值为可变长字符串。长度可以指定为0到65,535之间的值。(VARCHAR的最大有效长度由最大行大小和使用的字符集确定。整体最大长度是65,532字节）。<br/><br/>同CHAR对比，VARCHAR值保存时只保存需要的字符数，另加一个字节来记录长度(如果列声明的长度超过255，则使用两个字节)。<br/><br/>VARCHAR值保存时不进行填充。当值保存和检索时尾部的空格仍保留，符合标准SQL。<br/><br/>如果分配给CHAR或VARCHAR列的值超过列的最大长度，则对值进行裁剪以使其适合。如果被裁掉的字符不是空格，则会产生一条警告。如果裁剪非空格字符，则会造成错误(而不是警告)并通过使用严格SQL模式禁用值的插入。<br/><br/>下面的表显示了将各种字符串值保存到CHAR(4)和VARCHAR(4)列后的结果，说明了CHAR和VARCHAR之间的差别：<br/><br/>值&nbsp;&nbsp;CHAR(4)&nbsp;&nbsp;存储需求&nbsp;&nbsp;VARCHAR(4)&nbsp;&nbsp;存储需求<br/>''&nbsp;&nbsp;'&nbsp;&nbsp;&nbsp;&nbsp; '&nbsp;&nbsp;4个字节&nbsp;&nbsp;''&nbsp;&nbsp;1个字节<br/>'ab'&nbsp;&nbsp;'ab&nbsp;&nbsp;'&nbsp;&nbsp;4个字节&nbsp;&nbsp;'ab '&nbsp;&nbsp;3个字节<br/>'abcd'&nbsp;&nbsp;'abcd'&nbsp;&nbsp;4个字节&nbsp;&nbsp;'abcd'&nbsp;&nbsp;5个字节<br/>'abcdefgh'&nbsp;&nbsp;'abcd'&nbsp;&nbsp;4个字节&nbsp;&nbsp;'abcd'&nbsp;&nbsp;5个字节<br/>请注意上表中最后一行的值只适用不使用严格模式时；如果MySQL运行在严格模式，超过列长度不的值不保存，并且会出现错误。<br/><br/>从CHAR(4)和VARCHAR(4)列检索的值并不总是相同，因为检索时从CHAR列删除了尾部的空格。<br/>通过下面的例子说明该差别：<br/>mysql> CREATE TABLE vc (v VARCHAR(4), c CHAR(4));<br/>Query OK, 0 rows affected (0.02 sec)<br/><br/>mysql> INSERT INTO vc VALUES ('ab&nbsp;&nbsp;', 'ab&nbsp;&nbsp;');<br/>Query OK, 1 row affected (0.00 sec)<br/><br/>mysql> SELECT CONCAT(v, '+'), CONCAT(c, '+') FROM vc;<br/>+----------------+----------------+<br/>&#124; CONCAT(v, '+') &#124; CONCAT(c, '+') &#124;<br/>+----------------+----------------+<br/>&#124; ab&nbsp;&nbsp;+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#124; ab+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#124;<br/>+----------------+----------------+<br/>1 row in set (0.00 sec)<br/><br/><br/>根据分配给列的字符集校对规则对CHAR和VARCHAR列中的值进行排序和比较。<br/><br/>请注意所有MySQL校对规则属于PADSPACE类。这说明在MySQL中的所有CHAR和VARCHAR值比较时不需要考虑任何尾部空格。<br/><br/>例如：<br/>mysql> CREATE TABLE names (myname CHAR(10), yourname VARCHAR(10));<br/>Query OK, 0 rows affected (0.09 sec)<br/><br/>mysql> INSERT INTO names VALUES ('Monty ', 'Monty ');<br/>Query OK, 1 row affected (0.00 sec)<br/><br/>mysql> SELECT myname = 'Monty&nbsp;&nbsp;', yourname = 'Monty&nbsp;&nbsp;' FROM names;<br/>+-----------------------------+-------------------------------+<br/>&#124; myname = 'Monty&nbsp;&nbsp;' &#124; yourname = 'Monty&nbsp;&nbsp;' &#124;<br/>+-----------------------------+-------------------------------+<br/>&#124;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1 &#124;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1 &#124;<br/>+-----------------------------+-------------------------------+<br/>1 row in set (0.00 sec)<br/><br/>请注意所有MySQL版本均如此，并且它不受SQL服务器模式的影响。<br/><br/>对于尾部填充字符被裁剪掉或比较时将它们忽视掉的情形，如果列的索引需要唯一的值，在列内插入一个只是填充字符数不同的值将会造成复制键值错误。<br/><br/>CHAR BYTE是CHAR BINARY的别名。这是为了保证兼容性。<br/><br/>ASCII属性为CHAR列分配latin1字符集。UNICODE属性分配ucs2字符集。
]]>
</description>
</item><item>
<link>https://jackxiang.com/post//#blogcomment</link>
<title><![CDATA[[评论] mysql char(4)指的是四个字符，还是4个字节？ ]]></title> 
<author> &lt;user@domain.com&gt;</author>
<category><![CDATA[评论]]></category>
<pubDate>Thu, 01 Jan 1970 00:00:00 +0000</pubDate> 
<guid>https://jackxiang.com/post//#blogcomment</guid> 
<description>
<![CDATA[ 
	
]]>
</description>
</item>
</channel>
</rss>