参考链接:MySQL的varchar长度问题

今天用mysql做一个demo,创建了个表:

  1. -- 借款表
  2. CREATE TABLE jk (
  3. id int(5) NOT NULL auto_increment, -- 自增ID
  4. amount int not null, -- 借款本金
  5. remark varchar(255), -- 备注/摘要
  6. PRIMARY KEY (`id`)
  7. ) ;
  8.  
  9. insert into jk(amount,remark) values(20000,'付张三借款');
  10. insert into jk(amount,remark) values(10000,'付王小五借款');
  11. insert into jk(amount,remark) values(80000,'付宇文小四借款');
  12. insert into jk(amount,remark) values(20000,'付张三12ab借款');

由于这个表没有人的姓名做主键(暂不考虑人名重复),想取出来人名,就只能对remark字段做拆解了。

当然拆解的办法不止一种,我的思路是通过length、left、right三个函数,拆解得出借款人的姓名。

具体思路就是,通过left先取出不含“借款”的字符串str_l,再通过right函数对str_l去除"付"字。那么就得到了中间的名字了。

然后我写的代码是:

  1. -- 注意:这是错误写法!!!
  2. SELECT jk.id,jk.amount,jk.remark,
  3. LEFT(jk.remark,LENGTH(jk.remark)-2) AS '左边',# 去掉“借款”2
  4. RIGHT(jk.remark,LENGTH(jk.remark)-1) AS '右边',# 去掉“付”字
  5. RIGHT(
  6. LEFT(jk.remark,LENGTH(jk.remark)-2),
  7. LENGTH(LEFT(jk.remark,LENGTH(jk.remark)-2))-1
  8. ) AS NAME
  9. FROM jk;

看上去好像没毛病,先取长度,“借款”是两个字,所以减2;“付”是一个字,所以减1。菜鸟如我啊~。

然后结果却是吃了一鲸~:

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

果然啊,mysql的水比较深啊~查了一下资料,恍然大悟:当格式默认为utf-8时,varchar存储的汉字占3个字节,而length函数计算的长度其实就是字节个数

varchar(n)的这个n指的是字符数,而不是字节数,也就是当你定义varchar(255)时,不管中文 还是英文 都是存255个字符的,只不过length函数计算的是字节数而非字符数。

于是我改成了这样:

  1. select jk.id,jk.amount,jk.remark,
  2. length(jk.remark),#长度
  3. left(jk.remark,length(jk.remark)/3-2) as '左边',
  4. right(jk.remark,length(jk.remark)/3-1) as '右边',
  5. right(
  6. left(jk.remark,length(jk.remark)/3-2),
  7. length(left(jk.remark,length(jk.remark)/3-2))/3-1
  8. ) as name
  9. from jk;

结果是:

除了第四个,其他的都成功解析出了姓名。至于最后一条记录的姓名还是有问题,我觉得得换种思路了,以后再写吧。今天主要是想说一下varchar这个类型~

mysql 的varchar类型小记的更多相关文章

  1. MySQL中varchar类型在5.0.3后的变化

    1.mysql varchar类型变化:mysql 5.0.3 之前: 0--255字节 varchar(20)中的20表示字节数,如果存放urf8编码的话只能放6个汉字. MySQL 5.0.3 之 ...

  2. 关于Mysql查询varchar类型错误问题

    因为后台所有表ID都是按照雪花算法生成的18位数字,需要对接到Android,Ios和H5,此时H5会出现字符超长溢出,所以直接把ID改为varchar类型. 如我的一张表ID为varchar(18) ...

  3. 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不会 ...

  4. Mysql中varchar类型的猫腻!

    varchar的存储规则 4.0版本以下,varchar(20),指的是20字节,如果存放UTF8汉字时,只能存6个(每个汉字3字节). 5.0版本以上,varchar(20),指的是20字符,无论存 ...

  5. mysql生成varchar类型主键排序

    用uuid生成20位的主键 SELECT LEFT(REPLACE(UUID(), '-', ''),20) FROM DUAL 另一种方法: 因为数据库中有字母 需要排序的时候去除字母,重新取最大值 ...

  6. pgsql与mysql 下 varchar类型的数字文本的排序 区别

    两者都有cast函数,但使用方法完全不同. 1.在mysql中,cast( value as type) 将value的数据类型转换成type类型,其type可以为 二进制,同带binary前缀的效果 ...

  7. mysql处理varchar类型的between和and的时间问题少一天解决;

    select * from table where CJSJ day),"%Y-%m-%d") 数据库中的时间类型是varchar,传入的类型也是string 上述sql的意思是: ...

  8. MySQL的varchar类型注意事项

    前几天就在工作中发现这样一个问题:当某个字段的类型为varchar时,字段保存的值类似'100,200,300'  和 '100' 或 '100,400'.写SQL语句的时候就会犯这样的错误,例如: ...

  9. MySQL中varchar类型排序

    -- +0后就转换INT类型排序 SELECT * FROM T_TEST ORDER BY (SORT + 0) DESC ;

随机推荐

  1. dataTable 参数说明

    下面是一些常用的参数列表,比较常用或者有价值的标示为绿色. 功能参数(Features) 参数名 说明 参考值 默认值 autoWidth 定义是否由控件自动控制列宽 Boolean true def ...

  2. 从负数开始 ,跟随别大人脚步 ---java

    刚刚毕业    音乐生  目前在做 数据库测试和实施的相关工作 . 1个月前认识了别大人  , 打算边工作 ,边学习java 开启学习之路 . ..340多个G的java视频感觉解压完1T  足够我喝 ...

  3. easyUI slider滑块,在加载出来后,easyUI slider滑块禁用方法

    easyUI slider滑块禁用 如下图easyUI slider滑块,在加载出来后,需要禁止拉动 easyUI slider滑块禁用方法 //禁用$(s1).slider({ disabled:t ...

  4. js实现仿华为手机计算器,兼容电脑和手机屏幕

    效果图: 电脑端: 手机端: 源码: <!DOCTYPE html> <html lang="en"> <head> <meta char ...

  5. linux下安装mysql-5.7.20

    1.下载地址 https://downloads.mysql.com/archives/community/ 2.安装步骤 解压: groupadd mysql useradd -r -g mysql ...

  6. Python基础8:列表推导式(list)字典推导式(dict) 集合推导式(set)

    推导式分为列表推导式(list),字典推导式(dict),集合推导式(set)三种 1.列表推导式也叫列表解析式.功能:是提供一种方便的列表创建方法,所以,列表解析式返回的是一个列表格式:用中括号括起 ...

  7. centos 6.8 解决ibus输入法不正常显示的问题

    今天发现 ibus输入法打字时不正常显示,如下图

  8. Ajax关于readyState和status的讨论

    熟悉web开发的程序员想必对Ajax也不会陌生.现在已经有很多js框架封装了ajax实现,例如JQuery的ajax函数,调用起来非常方便.当然本文不打算讲框架的使用,我们将从Ajax的javascr ...

  9. RabbitMQ初学之二:直接发送消息到队列

    一. 背景 总前提:队列无论是在生产者声明还是在消费者声明,只有声明了,才能在RabbitMQ的管理界面看到该队列 生产者直接发送消息到队列,消费者直接消费队列中的消息,而不用指定exchange并绑 ...

  10. warning: already initialized constant FileUtils::VERSION

    Ran into this, and the solution here works: https://stackoverflow.com/questions/51334732/rails-5-2-0 ...