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                       |

扫描二维码关注公众号,回复: 370682 查看本文章

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

猜你喜欢

转载自lihaiming.iteye.com/blog/2256517