问题

最近工作中遇到一个问题,数据库字段设置的varchar(255),测试测的时候总是在临界点那边给我提bug,今天研究一下mysql和php字符长度判断。

环境

php7.2.9

mysql8.0.12

测试时文件的编码方式要是UTF8

数据库字段类型大小为 varchar(255),php中用strlen()与mb_strlen()函数。

注意

需要注意的是,mb_strlen并不是PHP核心函数,使用前需要确保在php.ini中加载了php_mbstring.dll,即确保

“extension=php_mbstring.dll”这一行存在并且没有被注释掉,否则会出现未定义函 数的问题。

分析

考虑到汉字的特殊性,我们测试主要分为两种,一个是纯汉字,一个是纯英文字母。

纯汉字

准备一个255个汉字的字符串,然后提交数据库查看结果。

//255个汉字

这是个十个汉字的句子这是个十个汉字的句子这是个十个汉字的句子这是个十个汉字的句子这是个十个汉字的句子这是个十个汉字的句子这是个十个汉字的句子这是个十个汉字的句子这是个十个汉字的句子这是个十个汉字的句子这是个十个汉字的句子这是个十个汉字的句子这是个十个汉字的句子这是个十个汉字的句子这是个十个汉字的句子这是个十个汉字的句子这是个十个汉字的句子这是个十个汉字的句子这是个十个汉字的句子这是个十个汉字的句子这是个十个汉字的句子这是个十个汉字的句子这是个十个汉字的句子这是个十个汉字的句子这是个十个汉字的句子这是个十个

php函数的结果

我们在提交前,看一下这两个php函数分别返回的值是多少

dd(strlen($this->beizhu),mb_strlen($this->beizhu,'UTF8') );

结果

可以看出mb_strlen($this->beizhu,’UTF8’),是我们要的结果。

提交到数据库

提交后发现可以成功保存:

我们把加一个汉字,继续提交,结果如下:

SQLSTATE[22001]: String data, right truncated: 1406 Data too long for column 'remark' at row 1

此时数据库报错了。

所以,该环境下varchar(255),可以存的汉字数是255个。

纯字母

我们以同样的方式测试字母,首先准备255个字母的字符串。

// 255个字母

ABCDEFGHIJABCDEFGHIJABCDEFGHIJABCDEFGHIJABCDEFGHIJABCDEFGHIJABCDEFGHIJABCDEFGHIJABCDEFGHIJABCDEFGHIJABCDEFGHIJABCDEFGHIJABCDEFGHIJABCDEFGHIJABCDEFGHIJABCDEFGHIJABCDEFGHIJABCDEFGHIJABCDEFGHIJABCDEFGHIJABCDEFGHIJABCDEFGHIJABCDEFGHIJABCDEFGHIJABCDEFGHIJABCDE

php函数的结果

我们在提交前,看一下这两个php函数分别返回的值是多少

dd(strlen($this->beizhu),mb_strlen($this->beizhu,'UTF8') );

结果

字母的情况下,php的strlen和mb_strlen($str,’UTF8’)得到的结果一样,都是返回255.

提交到数据库

测试是可以保存的,我们再往里面加个字母,可以发现报同样的错误。

结论

php在判断字段长度的时候用mb_strlen($str,'UTF8'),可以得到和我们输入字符一样的结果。

计算时,选定内码为UTF8,则会将一个中文字符当作长度1来计算,所以“中文a字1符”长度是6 ,虽然上面函数可以简单解决一些中英文混合问题,但是不能用于实际中,下面我来给各位朋友介绍其它比较好的办法。PHP获取中英文混合字符串长度的实现代码如下,1中文=1位,2英文=1位,可自行修改。

mb_strlen($str,'UTF8')

高版本 MySQL 中的 VARCHAR(255) 可以存放 1 - 255 个 UTF-8 格式的字符。

mysql和php长度的漏洞_mysql和php字符长度判断相关推荐

  1. mysql utf8 gbk_MySql中UTF8 和 GBK 编码中文字符长度问题

    为什么要了解MySql中UTF8 和 GBK 编码中文字符长度呢?举个例子,在oracle中用utf8 字段中文长度为1的话,需要char(3),mysql中则是char(1),如果你按照oracle ...

  2. mysql 写入随机字中文符_MySQL产生随机字符

    MySQL产生随机字符 UUID简介 UUID含义是通用唯一识别码 (Universally Unique Identifier),这是一个软件建构的标准,也是被开源软件基金会 (Open Softw ...

  3. mysql字符集与校对规则设置_mysql中的字符集和校对规则(mysql校对集)

    1.简要说明介绍 字符集和校对规则 字符集是一套符号和编码.校对规则是在字符集内用于比较字符的一套规则. MySql在collation提供较强的支持,oracel在这方面没查到相应的资料. 不同字符 ...

  4. css设置字符长度,在css中设置最大字符长度

    12 个答案: 答案 0 :(得分:199) 你总是可以通过设置max-width和溢出ellipsis来使用截断方法 p { white-space: nowrap; overflow: hidde ...

  5. 设置 html 最大长度,在CSS中设置最大字符长度

    通过设置max-width和溢出ellipsis你总是可以使用截断方法 p { white-space: nowrap; overflow: hidden; text-overflow: ellips ...

  6. mysql的varchar最大值是多少_MySQL varchar计算:求列的数额和计算N的最大值

    mysql varchar计算:求列的数目和计算N的最大值 有道面试题:若一张表中只有一个字段VARCHAR(N)类型,utf8编码,则N最大值为多少? 先明白计算的一些规则限制 ① 存储限制 需要额 ...

  7. 用Excel生成Ansys *VREAD函数所需的具有固定字符长度和小数位数的数据

    Ansys的*VREAD命令行之后一般应接着定义读入的数字格式(关于*VREAD的用法详见http://htbbzzg.blog.163.com/blog/static/697252062010102 ...

  8. SSIS - Excel Destination无法接受大于255个字符长度的字符字段(转载)

    从下文的链接中找到一些背景,因为Excel会以前8行作为参考,如果某个字段前8行的最长长度没有超过255个字符,就会报错.如果知道某个字段属于描述性字段,而且字段的数据长度很可能超过255个字符长度, ...

  9. mysql数据库char类型长度_mysql数据库设计字符类型及长度

    1.数字类型 小数的我就不聊了,因为有小数点的一般都是用字符串保存.关于整数,有几种可以选TINYINT.SMALLINT.MEDIUMINT.INT和BIGINT,分别占1.2.4.8字节.如果无符 ...

  10. mysql查所有值的长度_MySQL查询以获取列中所有值的字符长度?

    若要获取字符长度,请使用CHAR_LENGTH()方法.让我们首先创建一个表-mysql> create table DemoTable -> ( -> Name varchar(1 ...

最新文章

  1. sql基础教程和mysql基础教程_书评「SQL基础教程(第2版)」| 你应该知道的基础知识点梳理·上...
  2. Winform中使用NPOI实现Excel导入并赋值给DataTable
  3. php简单的登录界面,PHP实现简单用户登录界面
  4. Matlab中使用varargin来实现参数可变的函数
  5. mac java 配置环境变量配置_Mac 配置环境变量的方法
  6. R语言处理非线性回归模型C-D方程,【译文】R语言非线性回归入门
  7. 电子计算机上的GT是什么意思,计算机上的“GT”是什么意思啊
  8. YARN-client提交任务处理过程
  9. Android卡顿优化
  10. 从数据库中查询列表倒序排列(按照时间顺序)
  11. 学计算机学费一万多吗,计算机专业的学费是多少
  12. Dolphinscheduler 学习笔记
  13. 数据挖掘(4.1)--分类和预测
  14. 2007世界大学学术排名(上海交大)
  15. 2013最新手机QQ源码源码下载
  16. Mysql如何实现隔离级别 - 可重复读和读提交 源码分析
  17. WiFi信号强度--SIGNAL_POLL
  18. 【重识云原生】第六章容器基础6.4.5.2节——Deployment配置详细说明
  19. 《你有多自律,就有多自由》经典总结
  20. 《校园二手商品交易平台设计与实现》 任务书

热门文章

  1. 如何在B站读一个深度学习的研究生?
  2. 小车故障灯亮显示大全_原创案例丨17款迈锐宝XL缺缸故障
  3. 简单的达梦数据库使用DISTINCT去重
  4. 踩过的坑:__file__、__package__和__name__
  5. Nifi flow 备份恢复
  6. Linux C++线程池框架
  7. android 屏幕宽高
  8. 简历是这样选出来的!
  9. 关闭(取消)windows 2003中ie增强的安全配置?
  10. 关于windows2008重新启动需要重新设置分辨率的问题