mysql> show variables like 'character%';?
+--------------------------+----------------------------+
| Variable_name ? ? ? ? ? ?| Value ? ? ? ? ? ? ? ? ? ? ?|
+--------------------------+----------------------------+
| character_set_client ? ? | utf8 ? ? ? ? ? ? ? ? ? ? ? |
| character_set_connection | utf8 ? ? ? ? ? ? ? ? ? ? ? |
| character_set_database ? | utf8 ? ? ? ? ? ? ? ? ? ? ? |
| character_set_filesystem | binary ? ? ? ? ? ? ? ? ? ? |
| character_set_results ? ?| utf8 ? ? ? ? ? ? ? ? ? ? ? |
| character_set_server ? ? | utf8 ? ? ? ? ? ? ? ? ? ? ? |
| character_set_system ? ? | utf8 ? ? ? ? ? ? ? ? ? ? ? |
| character_sets_dir ? ? ? | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
?
8 rows in set
mysql字符集如上,经测验`company` varchar(100) COLLATE utf8_unicode_ci DEFAULT NULL COMMENT '公司',company可以存储100个汉字或100个英文。
?
以下是查找的资料,仅供参考:
?
Varchar?对每个英文(ASCII)字符都占用2个字节,对一个汉字也只占用两个字节
char?对英文(ASCII)字符占用1个字节,对一个汉字占用2个字节
Varchar?的类型不以空格填满,比如varchar(100),但它的值只是"qian",则它的值就是"qian"
而char?不一样,比如char(100),它的值是"qian",而实际上它在数据库中是"qian?"(qian后共有96个空格,
就是把它填满为100个字节)。
由于char是以固定长度的,所以它的速度会比varchar快得多!但程序处理起来要麻烦一点,要用trim之类的函数把两边的空格
去掉!?
资料引用:http://www.knowsky.com/1997.html
?
?
看你数据库的字符集是什么,如果是UTF8,则varchar2?100?可存100个汉字。
?
与这个参数有关系吧:nls_length_semantics
SQL>?select?value?from?nls_database_parameters?where?parameter?=?'NLS_CHARACTERSET';
VALUE
--------------------------------------------------------------------------------
AL32UTF8
SQL>?create?table?ss(ss?varchar2(10));
表已创建。
SQL>?insert?into?ss?values('代数式地方大师傅');
已创建?1?行。
SQL>?select?value?from?nls_database_parameters?where?parameter?=?'NLS_CHARACTERSET';
VALUE
--------------------------------------------------------------------------------
ZHS16GBK
SQL>?create?table?ss?(ss?varchar2(10));
表已创建。
SQL>?insert?into?ss?values('大撒法似的似的');
insert?into?ss?values('大撒法似的似的')
????????????*
ERROR?位于第?1?行:
ORA-01401:?插入的值对于列过大
?
SQL>?create?table?ss?(ss?varchar2(10));
表已创建。
SQL>?insert?into?ss?values('大撒法似的似的');
insert?into?ss?values('大撒法似的似的')
????????????*
ERROR?位于第?1?行:
ORA-01401:?插入的值对于列过大
=========================================================
这个与nls_length_semantics的设置有关,因为其当前设置为byte
需要改变一下建表时的定义,这么写:
create?table?ss?(ss?varchar2(10?char));
如果nls_length_semantics的值为char,则没有上述问题