数据库中的 varchar(255)

本文深入解析MySQL中VARCHAR类型在不同版本下对UTF-8编码的支持差异,包括存储方式、最大容量及索引限制,揭示其对汉字存储的影响。

在字符集为UTF-8的情况下:

MySQL | ver < 4.1: VARCHAR以字节为单位存储,所以假设全部为常用汉字(UTF-8

3字节编码长度),则VARCHAR(255)共可存放约85个汉字;

MySQL | ver >= 4.1:

VARCHAR以字符为单位存储,假设输入仍然为常用汉字,则VARCHAR(255)可以存放255个汉字。 

另外,据我所知,MySQL对UTF-8的支持也仅仅限于1~3字节编码长度(Unicode:0x0000~0xFFFF),可以满足大部分需求,但是生僻字就不行了。

那么VARCHAR的最大值是多少呢?

根据官方文档,VARCHAR 最多可以是 65535 字节(这也意味着一条记录只有这一个字段,因为 MySQL 一行只能包含 65535 字节)。

然而,无法为这么长的 VARCHAR 做索引,对于 MyISAM,可以对前 1000 个字节做索引,对于 InnoDB,则只有 767 字节。(来源依据

这里说的是字节,考虑到编码的因素(UTF-8 字符占1-3字节,GBK 字符占两个字节),以及 VARCHAR 所有信息需要多 1 个字节(即空串也占 1 字节),使用 VARCHAR(256) 比较省事。

 

数据库中,不同数据库对于`varchar`类型比较大小的方式有所不同,下面以常见的 MySQL 和 Oracle 数据库为例进行说明。 ### MySQL 中`varchar`类型比较大小 在 MySQL 中,`varchar`类型比较大小是基于字符的编码顺序进行的。如果存储的是数字字符串,直接比较可能会得到不符合预期的结果,因为它是按字符逐个比较的。例如: ```sql -- 创建测试表 CREATE TABLE check_test ( id int(11) NOT NULL AUTO_INCREMENT, current_price varchar(10) NOT NULL, price varchar(10) NOT NULL, PRIMARY KEY (id) ); -- 插入测试数据 INSERT INTO check_test VALUES ('1', '12', '14'); INSERT INTO check_test VALUES ('2', '22', '33'); INSERT INTO check_test VALUES ('3', '15', '8'); INSERT INTO check_test VALUES ('4', '9', '7'); INSERT INTO check_test VALUES ('5', '12', '12.9'); -- 直接比较 varchar 类型的数字字符串 SELECT * FROM check_test WHERE current_price > price; ``` 在上述示例中,对于`current_price`和`price`字段,如果要按数字大小比较,需要使用`CAST`或`CONVERT`函数将其转换为数值类型: ```sql SELECT * FROM check_test WHERE CAST(current_price AS DECIMAL(10, 2)) > CAST(price AS DECIMAL(10, 2)); ``` ### Oracle 中`varchar`类型比较大小 在 Oracle 中,`varchar2`(类似于 MySQL 的`varchar`)类型比较大小同样是基于字符的编码顺序。如果要比较数字字符串的大小,也需要进行类型转换。例如: ```sql -- 创建测试表 CREATE TABLE check_test ( id NUMBER, current_price VARCHAR2(10), price VARCHAR2(10) ); -- 插入测试数据 INSERT INTO check_test VALUES (1, '12', '14'); INSERT INTO check_test VALUES (2, '22', '33'); INSERT INTO check_test VALUES (3, '15', '8'); INSERT INTO check_test VALUES (4, '9', '7'); INSERT INTO check_test VALUES (5, '12', '12.9'); -- 直接比较 varchar2 类型的数字字符串 SELECT * FROM check_test WHERE current_price > price; -- 按数字大小比较,需要将其转换为数值类型 SELECT * FROM check_test WHERE TO_NUMBER(current_price) > TO_NUMBER(price); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值