mysql 的varchar类型小记
参考链接:MySQL的varchar长度问题
今天用mysql做一个demo,创建了个表:
-- 借款表
CREATE TABLE jk (
id int(5) NOT NULL auto_increment, -- 自增ID
amount int not null, -- 借款本金
remark varchar(255), -- 备注/摘要
PRIMARY KEY (`id`)
) ; insert into jk(amount,remark) values(20000,'付张三借款');
insert into jk(amount,remark) values(10000,'付王小五借款');
insert into jk(amount,remark) values(80000,'付宇文小四借款');
insert into jk(amount,remark) values(20000,'付张三12ab借款');
由于这个表没有人的姓名做主键(暂不考虑人名重复),想取出来人名,就只能对remark字段做拆解了。
当然拆解的办法不止一种,我的思路是通过length、left、right三个函数,拆解得出借款人的姓名。
具体思路就是,通过left先取出不含“借款”的字符串str_l,再通过right函数对str_l去除"付"字。那么就得到了中间的名字了。
然后我写的代码是:
-- 注意:这是错误写法!!!
SELECT jk.id,jk.amount,jk.remark,
LEFT(jk.remark,LENGTH(jk.remark)-2) AS '左边',# 去掉“借款”2字
RIGHT(jk.remark,LENGTH(jk.remark)-1) AS '右边',# 去掉“付”字
RIGHT(
LEFT(jk.remark,LENGTH(jk.remark)-2),
LENGTH(LEFT(jk.remark,LENGTH(jk.remark)-2))-1
) AS NAME
FROM jk;
看上去好像没毛病,先取长度,“借款”是两个字,所以减2;“付”是一个字,所以减1。菜鸟如我啊~。
然后结果却是吃了一鲸~:

为什么呢?第一反应是长度计算有问题,我就把length函数计算的结果单独列出来:

果然啊,mysql的水比较深啊~查了一下资料,恍然大悟:当格式默认为utf-8时,varchar存储的汉字占3个字节,而length函数计算的长度其实就是字节个数。
varchar(n)的这个n指的是字符数,而不是字节数,也就是当你定义varchar(255)时,不管中文 还是英文 都是存255个字符的,只不过length函数计算的是字节数而非字符数。
于是我改成了这样:
select jk.id,jk.amount,jk.remark,
length(jk.remark),#长度
left(jk.remark,length(jk.remark)/3-2) as '左边',
right(jk.remark,length(jk.remark)/3-1) as '右边',
right(
left(jk.remark,length(jk.remark)/3-2),
length(left(jk.remark,length(jk.remark)/3-2))/3-1
) as name
from jk;
结果是:

除了第四个,其他的都成功解析出了姓名。至于最后一条记录的姓名还是有问题,我觉得得换种思路了,以后再写吧。今天主要是想说一下varchar这个类型~
mysql 的varchar类型小记的更多相关文章
- MySQL中varchar类型在5.0.3后的变化
1.mysql varchar类型变化:mysql 5.0.3 之前: 0--255字节 varchar(20)中的20表示字节数,如果存放urf8编码的话只能放6个汉字. MySQL 5.0.3 之 ...
- 关于Mysql查询varchar类型错误问题
因为后台所有表ID都是按照雪花算法生成的18位数字,需要对接到Android,Ios和H5,此时H5会出现字符超长溢出,所以直接把ID改为varchar类型. 如我的一张表ID为varchar(18) ...
- 2020-06-07:mysql中varchar类型的id,where id=1,会用到索引吗?int 类型的id,where id="1",会用到索引吗?为什么?
福哥答案2020-06-07: 答案来自群员:对于int类型id,查询的varchar 类型 ‘1’会隐式转换成 1,‘1’和 1都能正常走索引:对于varchar类型id,查询的int 类型 1不会 ...
- Mysql中varchar类型的猫腻!
varchar的存储规则 4.0版本以下,varchar(20),指的是20字节,如果存放UTF8汉字时,只能存6个(每个汉字3字节). 5.0版本以上,varchar(20),指的是20字符,无论存 ...
- mysql生成varchar类型主键排序
用uuid生成20位的主键 SELECT LEFT(REPLACE(UUID(), '-', ''),20) FROM DUAL 另一种方法: 因为数据库中有字母 需要排序的时候去除字母,重新取最大值 ...
- pgsql与mysql 下 varchar类型的数字文本的排序 区别
两者都有cast函数,但使用方法完全不同. 1.在mysql中,cast( value as type) 将value的数据类型转换成type类型,其type可以为 二进制,同带binary前缀的效果 ...
- mysql处理varchar类型的between和and的时间问题少一天解决;
select * from table where CJSJ day),"%Y-%m-%d") 数据库中的时间类型是varchar,传入的类型也是string 上述sql的意思是: ...
- MySQL的varchar类型注意事项
前几天就在工作中发现这样一个问题:当某个字段的类型为varchar时,字段保存的值类似'100,200,300' 和 '100' 或 '100,400'.写SQL语句的时候就会犯这样的错误,例如: ...
- MySQL中varchar类型排序
-- +0后就转换INT类型排序 SELECT * FROM T_TEST ORDER BY (SORT + 0) DESC ;
随机推荐
- mysql-mmm
查看mmm集群状态: mmm_control show 给主机设置ip: mmm_control set_ip ip host 改变状态: mmm_control set_passive|active ...
- mysql主从同步详细教程
1.安装好主数据库和从数据库,这个大家肯定都会,如果不是很明白,可以参考我前面的安装教程. 例子: 假如我需要同步test1.test2数据库 系统:centos7 主库主机:192.168.1.25 ...
- [BZOJ2758] [SCOI2012]Blinker的噩梦 扫描线+set
题目大意:有n个圆或凸多边形,这些图形不会相交,每当走入或走出一个图形时需要异或上一个代价,有m组操作: 询问操作,每次询问从一个点走到另一个点时,需要的代价(初始代价为0) 修改操作,每次修改一个图 ...
- (转)Python中集合(set)的基本操作以及一些常见的用法
原文:http://blog.51cto.com/10616534/1944841 Python除了List.Tuple.Dict等常用数据类型外,还有一种数据类型叫做集合(set),集合的最大特点是 ...
- Windows10下简单搭建zookeeper
转载请注明源出处:http://www.cnblogs.com/lighten/p/6798669.html 1 简介 zookeeper是Apache的一个开源项目,致力于开发和维护一个开源的服务器 ...
- java c :foreach 标签怎么获取自增分页序号
问题描述: 如果每页10条,下一页就从11递增,依次类推:用varStatus,下一页又从1开始了 解决方案: <c:forEach var="pag" begin=&quo ...
- 视口(viewport)原理详解之第一部分
在这篇文章中,我将解释viewports和元素width是如何工作的,比如html元素. window和 screen. 这篇文章主要针对桌面浏览器,但它的部分和移动设备中的结论也比较类似,所以也是 ...
- Ubuntu11.10 带图形安装步骤详解
不多说,直接上干货! 成功! 关于Ubuntu的网络设置.静态IP设置,见 Ubuntukylin-14.04-desktop( 不带分区)安装步骤详解 Ubuntukylin-14.04-desk ...
- sql 时期格式整理
我们经常出于某种目的需要使用各种各样的日期格式,当然我们可以使用字符串操作来构造各种日期格式,但是有现成的函数为什么不用呢? SQL Server中文版的默认的日期字段datetime格式是yyyy- ...
- Chapter 3 Phenomenon——3
It took every ounce of my concentration to make it down the icy brick driveway alive. 我用所有我的注意力去确定车道 ...