PHP各编码下字符占用说明
字符集(Charset)是多个字符的集合;
字符编码(encoding)就是以二进制的数字来对应字符集的字符。
如Unicode字符集可依不同需要以UTF-8、UTF-16、UTF-32等方式编码
常见字符集有: ASCII字符集、GB2312字符集、BIG5字符集、Unicode字符集等
常见字符编码: ASCII码、GB2312、GBK、Unicode、UTF-8
每个字符编码都有一个唯一的编号,称为代码页(Code Page)。如简体中文(GB2312)字符编码的代码页为936
UTF-8编码:
一个英文字母、数字、各种符号均占1byte;一个中文(含繁体)、中文标点占3byte
GBK编码/GB2312编码:
一个英文字母、数字、各种符号均占1byte;一个中文(含繁体)、中文标点占2byte
1个字节等于8个二进制位 1byte=8bit
网页输出乱码解决:
检查文件header头编码与文件保存编码+Bom是否一致(UTF-8一般保存为UTF-8无BOM)
PHP:
header("content-Type: text/html; charset=UTF-8");
html:
<meta charset="utf-8">
计算字符串长度:
strlen()函数返回字符串所占的字节长度,对于带中文的字符串长度计算不准确;
mb_strlen()函数返回字符串的长度,多字节的字符被计为 1
计算中文字数mb_strlen()函数需要mbstring模块开启支持,在php.ini里有相关语言编码设置
而mb_strlen要得到正确结果需要保证header头编码与设置编码一致
//mb_detect_order(); // 设置/获取 字符编码的检测顺序
//mb_internal_encoding(); // 设置/获取内部字符编码
$encoding='UTF-8';
mb_strlen('中国ok',$encoding) //UTF-8 GBK GB2312
字符串转码
string iconv ( string $in_charset , string $out_charset , string $str )
将字符串 str 从 in_charset 转换编码到 out_charset;
out_charset 后加字符串 //TRANSLIT,当一个字符不能被目标字符集所表示时,它可以通过一个或多个形似的字符来近似表达;
加字符串 //IGNORE,不能以目标字符集表达的字符将被默默丢弃;
否则,str 从第一个无效字符开始截断并导致一个 E_NOTICE。
MySQL数据列类型
MySQL 以一个可选的显示宽度指示器的形式对 SQL 标准进行扩展,
显示宽度与存储大小或类型包含的值的范围无关。
数值类型
如果为一个数值列指定ZEROFILL,MySQL自动为该列添加UNSIGNED属性;
若插入数据字段超出范围,则实际插入字段设置最大值。
如DECIMAL(5,2) 999999保存为999.99,995.9998保存为996(四舍五入原则)
字符串类型
VARCHAR、BLOB和TEXT类是变长类型。
每个类型的存储需求取决于列值的实际长度(用下面的表中的L表示),而不是该类型的最大可能的大小。
例如,VARCHAR(10)列可以容纳最大长度为10的字符串。
实际存储需求是字符串(L)的长度,加上一个记录字符串长度的字节。对于字符串'abcd',L是4,存储需要5个字节。
对于CHAR、VARCHAR和TEXT类型,下面的表中的值L和M应解释为字符数目,并且列定义中的这些类型的长度表示字符数目。
例如,要想保存一个TINYTEXT值需要L字符+ 1个字节。
MyISAM表中行的最大大小为65,534字节。每个BLOB和TEXT列 账户只占其中的5至9个字节。
如果MyISAM表包括变长列类型,记录格式也是可变长度。
当创建表时,在某些条件下,MySQL可以将一个列从变长类型改为固定长度的类型或反之亦然。
VARCHAR(M) 变长字符串。M最大可以设置多少:
utf-8下为65535个字节,但是varchar保存时用一个字节或两个字节长的前缀+数据。
如果varchar列声明的长度大于255,长度前缀是两个字节,所以varchar的最大长度应为:
65532=65535-1-2(字节)
utf-8下为 21844=65532/3(字符)
VARCHAR(M) M最大极端可以设置为21844(在没有其他列的情况下)**
CREATE TABLE `test` (
`va` varchar(21844) DEFAULT NULL,
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
TEXT[(M)] 变长字符串。TEXT最少需要多少字节:
每个BLOB和TEXT列 账户只占其中的5至9个字节。BLOB和TEXT类型需要 1、2、3或者4个字节来记录列值的长度,取决于该类型的最大可能的长度。那么TEXT至少需要10字节(9+1)的空间:
CREATE TABLE `test` (
`va` varchar(21840) DEFAULT NULL,
`tx` text
) ENGINE=MyISAM DEFAULT CHARSET=utf8;