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 ;
随机推荐
- 关于省,市,区联动 java 实现方式
关于省,市,区的三级联动后台的实现有两种方式: 1:分三次请求各自取出 省 市 区 的数据: 2:一次请求获得所有的数据,并且组装成相依的数据结构到前端: 其中第一种方式: 会导致数据的延迟加载,出现 ...
- [Swift实际操作]七、常见概念-(9)使用定时组件Timer执行定时任务
本文将为你演示计时器的使用,使用计时器可以每隔一定时间执行某个函数. 在左侧的项目导航区,打开视图控制器的代码文件:ViewController.swift现在开始编写代码,实现任务定时的功能.定义一 ...
- 记一次使用SecureCRT连接局域网巨慢的问题
环境:Win7 32bit + SecureCRT 6.5 中文 使用工作机上的SecureCRT登录公司内网的跳板机,发现很慢,每次都得等待好几分钟才弹出输出私匙密码的框.咨询了一下其他同事,发现他 ...
- iOS----线程之间的通信
当线程的数量大于一个的时候,线程之间可能会产生通信,既一个线程产生的结果要被另一个线程用到. 比如常用的图片的加载就是这个样子.图片的加载是在子线程进行的,当图片加载完毕,就会回到主线程中刷新UI,展 ...
- klee的docker镜像中没有gcc环境
sudo apt-get update 密码 klee sudo apt-get install gcc export LD_LIBRARY_PATH=/home/klee/lib/:$LD_LIBR ...
- Maven 上传本地包到仓库 (来源于同事(gagahjt)的笔记本)
1:将本地jar包导入到自己的Maven仓库 mvn install:install-file -Dfile=D:\\kaptcha-2.3.2.jar -DgroupId=com.google -D ...
- eclipse outline 中图标含义
先说颜色: 绿色:public 黄色:protected 蓝色:no modifier 红色:private 再说形状: 实心:method 空心:variable 实心中间有字母C:c ...
- (转)Python 3 collections.defaultdict() 与 dict的使用和区别
原文:https://www.cnblogs.com/herbert/archive/2013/01/09/2852843.html 在Python里面有一个模块collections,解释是数据类型 ...
- inline-block各浏览器兼容以及水平间隙问题解决方案
inline-block属性 This value causes an element to generate a block box, which itself is flowed as a sin ...
- 初始JAVA中浅拷贝和深拷贝
1. 简单变量的复制 public static void main(String[] args) { int a = 5; int b = a; System.out.println(a); Sys ...