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

### 关于 PHP MySQL 中 `varchar(1000)` 字段能储的汉字数量 在 MySQL 的设计中,`varchar(n)` 表示该字段能够储的最大字符数为 n。具体到汉字的数量,则取决于所使用的字符集以及版本特性。 #### 1. **MySQL 版本的影响** 对于 MySQL 5.0 及更高版本,`varchar(1000)` 指定的是字符长度而非字节数量[^3]。这意味着无论是英文字母、数字还是 UTF-8 编码下的汉字,均按单个字符计算。然而,由于 UTF-8 下的一个汉字通常占用 3 个字节的空间,因此实际储容量受到总字节限制影响。 #### 2. **字符集的选择** 当采用 UTF-8 字符集时,一个汉字理论上需要 3 个字节来表示。而 MySQL 对每行数据有最大允许大小(约 65,535 字节),这进一步约束了 `varchar` 能够容纳的内容总量。假设我们忽略其他列的在并专注于单一 `varchar(1000)` 列: - 如果定义为 `varchar(1000)` 并使用 UTF-8 字符集,则此字段最多可储大约 \( \lfloor 1000 / 3 \rfloor = 333 \)汉字[^2]。 这是因为即使指定了 1000 个字符的位置,考虑到每个汉字占据三倍空间的事实,最终有效承载能力下降至三分之一左右。 另外值得注意的是,在某些特殊情况下(如使用 utf8mb4 字符集支持表情符号等扩展字符),每个字符可能会消耗更多字节(最高可达四个字节)。此时同样长度设定下所能保的实际汉字数目还会更少一些。 #### 示例代码展示如何查询字符串长度差异 下面给出一段简单的 PHP 测试脚本来帮助理解不同函数测量结果之间的区别: ```php <?php // 设置默认编码为 UTF-8 header('Content-Type: text/html;charset=utf-8'); $testStr = '你好吗abc'; echo "Using mb_strlen with specified encoding (UTF-8): "; var_dump(mb_strlen($testStr,'utf8')); // 输出 int(5) echo "<br>"; echo "Using strlen(): "; var_dump(strlen($testStr)); // 输出 int(7), 因为它计数的是原始字节数而不是逻辑上的'字符' ?> ``` 通过运行上述程序可以看到,尽管视觉上看起来只有五个独立单位构成整个串(`你`, `好`, `吗`, `a`, `b`) ,但由于内部实现细节的不同,两种方法返回的结果并不相同。 ### 结论 综上所述,在标准配置条件下(即使用 UTF-8 字符集且无额外复杂因素干扰的情况下),MySQL 数据库内的 `varchar(1000)` 类型字段大致可以储接近三百三十多个常规汉字
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

混进IT圈

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值