一、理解MySQL varchar(50)
1.1、概述
日常开发中,数据库建表是必不可少的一个环节,建表的时候通常会看到设定某个字段的长度为varchar(50),例如如下建表语句:
那么怎么理解varchar(50)?这个分情况的,MySQL的版本不同,存储的字符长度也不同,具体来讲如下:
(1)4.0版本以下,varchar(50),指的是50字节,如果存放UTF8汉字时,只能存16个(每个汉字3字节);
(2)5.0版本以上,varchar(50),指的是50字符,无论存放的是数字、字母还是UTF8汉字(每个汉字3字节),都可以存放50个;
其实最好的办法是在自己数据库中建个表试试可以放多少汉字,现在公司开发中MySQL的版本至少都为5.xx版本及以上版本了,所以说varchar(50)是可以存50个汉字的;
1.2、验证
1.2.1、当前MySQL的版本
1.2.2、数据库验证
(一)初始化表
DROP TABLE IF EXISTS `account`;
CREATE TABLE `account` (
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键',
`is_deleted` int NOT NULL DEFAULT 0 COMMENT '删除标识 0:未删除、1:已删除',
`create_time` datetime NOT NULL COMMENT '创建时间',
`update_time` datetime NULL DEFAULT NULL COMMENT '修改时间',
`name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '姓名',
`money` decimal(10,0) NULL DEFAULT NULL COMMENT '账户余额',
`email` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '邮箱',
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '账户表' ROW_FORMAT = DYNAMIC;insert into `account` values
(null,0,now(),now(),'张三','1000000','zhangsan@qq.com'),
(null,0,now(),now(),'尼古拉斯赵四','3000000','zhaosi@qq.com');(二)查询name占用几个字符
select `name`,char_length(`name`) from account;
1.3、题外话
MySQL中的length VS char_length:
length():mysql里面的length()函数是一个用来获取字符串长度的内置函数;
char_length():在mysql内置函数里面查看字符串长度的还有一个函数是char_length();
区别:
length(): 单位是字节,utf8编码下,一个汉字三个字节,一个数字或字母一个字节。gbk编码下,一个汉字两个字节,一个数字或字母一个字节;
char_length():单位为字符,不管汉字还是数字或者是字母都算是一个字符;