当前位置: 代码迷 >> MySQL >> mysql中varchar(100)可以存100个汉字跟100个英文
  详细解决方案

mysql中varchar(100)可以存100个汉字跟100个英文

热度:167   发布时间:2016-05-05 16:35:37.0
mysql中varchar(100)可以存100个汉字和100个英文

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,则没有上述问题

  相关解决方案