精华内容
下载资源
问答
  • 工作中为了方便后续扩展,建表时将数字类型定义为varchar类型进行存储,但是在排序时会乱序,这里是因为mysql默认order by 只对数字与日期类型可以排序 演示: 一、数据初始化 CREATE TABLE `testvarcharmax` ( ...

    工作中为了方便后续扩展,建表时将数字类型定义为varchar类型进行存储,但是在排序时会乱序,这里是因为mysql默认order by 只对数字与日期类型可以排序

    演示:

    一、数据初始化

    CREATE TABLE `testvarcharmax` (
      `age` varchar(32) DEFAULT NULL
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
    
    insert into testvarcharmax VALUES ('1'),('2'),('3'),('4'),('5'),('6'),('7'),('8'),('9'),('10'),('11');
    

    二、错误结果

    1.求age的最大值,结果预期为11,但是sql结果显示9

    mysql> select MAX(age) from testvarcharmax;
    +----------+
    | MAX(age) |
    +----------+
    | 9        |
    +----------+
    1 row in set (0.00 sec)

    2.按age倒叙排列,结果预期第一行为11,但结果显示9

    mysql> select age from testvarcharmax order by age desc;
    +------+
    | age  |
    +------+
    | 9    |
    | 8    |
    | 7    |
    | 6    |
    | 5    |
    | 4    |
    | 3    |
    | 2    |
    | 11   |
    | 10   |
    | 1    |
    +------+
    11 rows in set (0.00 sec)

    三、修改sql语句

    方式一:对age执行加法运算,sql语句改为:

    select MAX(age+0) from testvarcharmax;

    select age from testvarcharmax order by age+0 desc;

    mysql> select MAX(age+0) from testvarcharmax;
    +------------+
    | MAX(age+0) |
    +------------+
    |         11 |
    +------------+
    1 row in set (0.00 sec)
    
    mysql> select age from testvarcharmax order by age+0 desc;
    +------+
    | age  |
    +------+
    | 11   |
    | 10   |
    | 9    |
    | 8    |
    | 7    |
    | 6    |
    | 5    |
    | 4    |
    | 3    |
    | 2    |
    | 1    |
    +------+
    11 rows in set (0.00 sec)

    方式二:使用CAST函数字将age转换为int后求最大值或排序、sql语句修改为:

    select MAX(CAST(age as signed int)) as maxAge from testvarcharmax;(或select MAX(CAST(age as signed integer)) as maxAge from testvarcharmax; select MAX(CAST(age as signed)) as maxAge from testvarcharmax;)

    select age from testvarcharmax order by CAST(age as SIGNED) desc; (或select age from testvarcharmax order by CAST(age as SIGNED int) desc; select age from testvarcharmax order by CAST(age as SIGNED integer) desc;)

    mysql> select MAX(CAST(age as signed integer)) as maxAge from testvarcharmax;
    +--------+
    | maxAge |
    +--------+
    |     11 |
    +--------+
    1 row in set (0.00 sec)
    
    mysql> select MAX(CAST(age as signed int)) as maxAge from testvarcharmax;
    +--------+
    | maxAge |
    +--------+
    |     11 |
    +--------+
    1 row in set (0.00 sec)
    
    mysql> select MAX(CAST(age as signed)) as maxAge from testvarcharmax;
    +--------+
    | maxAge |
    +--------+
    |     11 |
    +--------+
    1 row in set (0.00 sec)
    
    mysql> select age from testvarcharmax order by CAST(age as SIGNED) desc;
    +------+
    | age  |
    +------+
    | 11   |
    | 10   |
    | 9    |
    | 8    |
    | 7    |
    | 6    |
    | 5    |
    | 4    |
    | 3    |
    | 2    |
    | 1    |
    +------+
    11 rows in set (0.00 sec)
    
    mysql> select age from testvarcharmax order by CAST(age as SIGNED int) desc;
    +------+
    | age  |
    +------+
    | 11   |
    | 10   |
    | 9    |
    | 8    |
    | 7    |
    | 6    |
    | 5    |
    | 4    |
    | 3    |
    | 2    |
    | 1    |
    +------+
    11 rows in set (0.00 sec)
    
    mysql> select age from testvarcharmax order by CAST(age as SIGNED integer) desc;
    +------+
    | age  |
    +------+
    | 11   |
    | 10   |
    | 9    |
    | 8    |
    | 7    |
    | 6    |
    | 5    |
    | 4    |
    | 3    |
    | 2    |
    | 1    |
    +------+
    11 rows in set (0.00 sec)

    方式三、使用CONVERT函数将age转换为int后求最大值或排序、sql语句修改为:

    select MAX(CONVERT(age, signed)) as maxAge from testvarcharmax;(或select MAX(CONVERT(age, signed int)) as maxAge from testvarcharmax; select MAX(CONVERT(age, signed integer)) as maxAge from testvarcharmax;)

    select age from testvarcharmax order by CONVERT(age, SIGNED) desc; (或select age from testvarcharmax order by CONVERT(age, SIGNED int) desc; select age from testvarcharmax order by CONVERT(age, SIGNED integer) desc;)

    mysql> select MAX(CONVERT(age, signed)) as maxAge from testvarcharmax;
    +--------+
    | maxAge |
    +--------+
    |     11 |
    +--------+
    1 row in set (0.00 sec)
    
    mysql> select MAX(CONVERT(age, signed int)) as maxAge from testvarcharmax;
    +--------+
    | maxAge |
    +--------+
    |     11 |
    +--------+
    1 row in set (0.00 sec)
    
    mysql> select MAX(CONVERT(age, signed integer)) as maxAge from testvarcharmax;
    +--------+
    | maxAge |
    +--------+
    |     11 |
    +--------+
    1 row in set (0.00 sec)
    
    mysql> select age from testvarcharmax order by CONVERT(age, SIGNED) desc;
    +------+
    | age  |
    +------+
    | 11   |
    | 10   |
    | 9    |
    | 8    |
    | 7    |
    | 6    |
    | 5    |
    | 4    |
    | 3    |
    | 2    |
    | 1    |
    +------+
    11 rows in set (0.00 sec)
    
    mysql> select age from testvarcharmax order by CONVERT(age, SIGNED int) desc;
    +------+
    | age  |
    +------+
    | 11   |
    | 10   |
    | 9    |
    | 8    |
    | 7    |
    | 6    |
    | 5    |
    | 4    |
    | 3    |
    | 2    |
    | 1    |
    +------+
    11 rows in set (0.00 sec)
    
    mysql> select age from testvarcharmax order by CONVERT(age, SIGNED integer) desc;
    +------+
    | age  |
    +------+
    | 11   |
    | 10   |
    | 9    |
    | 8    |
    | 7    |
    | 6    |
    | 5    |
    | 4    |
    | 3    |
    | 2    |
    | 1    |
    +------+
    11 rows in set (0.00 sec)

     

    展开全文
  • SQL Server取varchar最大值

    千次阅读 2020-01-02 14:25:53
    有效的语句: SELECT MAX(CAST(L_UID as INTEGER)) FROM SYS_LOGGER 场景:某表的主键字段为VARCHAR,现需要获得主键的最大值 无效的语句: SELECT MAX(L_UID) FROM SYS_LOGGER ...

    有效的语句:

    SELECT MAX(CAST(L_UID as INTEGER))
    FROM SYS_LOGGER
    

    场景:某表的主键字段为VARCHAR,现需要获得主键的最大值


    无效的语句:

    SELECT MAX(L_UID)
    FROM SYS_LOGGER
    
    展开全文
  • 写在前面关于MySQL varchar字段类型的最大值计算,也许我们一直都理解错误了,本文从问题出发,经实践验证得出一些实用经验,希望对大家的开发工作有些帮助~背景描述最近同事在做技术方...

    写在前面

    关于MySQL varchar字段类型的最大值计算,也许我们一直都理解错误了,本文从问题出发,经实践验证得出一些实用经验,希望对大家的开发工作有些帮助~

    背景描述

    最近同事在做技术方案设计时候,考虑到一个表设计时希望利用varchar类型进行存储,而不是采用text,那就需要确定下varchar允许的最大长度是多少,用来评估下后期是否会遇到存储长度瓶颈。

    那问题来了:MySQL 数据库的varchar字段类型最大存储长度到底是多少?

    问题分析

    一切以官方文档为准,翻了下官方描述如下:

    In MySQL 4.1 the length is always 1 byte. In MySQL 5.0 the length may be either 1 byte (for up to 255) or 2 bytes (for 256 to 65535).

    大概意思就是说:

    • 在MySQL 4.1以前,长度总是1个字节(varchar(20),指的是20字节)

    • 在MySQL 5.0以后,长度可以是1字节(最多255个字节)或2个字节(256到65535)

    

    按照官网说法最大值是65535bytes,utf8mb4编码情况下每个字符占4个bytes,最大值应该为16383.75

    65535/4=16383.75
    

    实践验证

    到此貌似已经有了结论了,但实际情况真的是这样的么?

    我们来实验下试试看?

    mysql 版本:
    select version(); // 5.7
    

    1、若一个表只有一个varchar类型

    定义如下:

    CREATETABLE`t1` (  
      `c`varchar(N) DEFAULTNULL
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
    
    那表 t1 的`c`字段的最大长度N为多少呢?
    (65535−1−2)/4=16383
    

    备注:

    · 减1的原因是实际行存储从第二个字节开始;

    · 减2的原因是varchar头部的2个字节表示长度;

    · 除4的原因是字符编码是utf8mb4。

    2)若表中包含其他多种类型的情况呢

    定义如下:

    CREATETABLE`t2` (
      `c1`int(10) DEFAULTNULL,
      `c2`char(32) DEFAULTNULL,
      `c3`varchar(N) DEFAULTNULL
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
    
    那表 t2 的`c3`字段的最大长度N为多少呢?
    
    (65535−1−2−4−32*4)/4=16350
    

    备注:

    · 减1、减2的原因同上;

    · 减4的原因是int类型占用4个字节;

    · 减32*4的原因是utf8mb4编码的char类型占用4个字节(长度32)

    

    我们来验证一下是否如上述推断计算所述:

    1)修改t2表`c3`字段长度为16350

    alter table `t2` modify column `c3` varchar(16350);
    

    执行成功。
    

    2)修改t2表`c3`字段长度为16351

    alter table `t2` modify column `c3` varchar(16351);
    
    执行失败,报错信息如下:
    

    Row size too large. The maximum row size for the used table type, not counting BLOBs, is 65535. This includes storage overhead, check the manual. You have to change some columns to TEXT or BLOBs.

    总结一下

    Q:varchar到底能存多少个字符?

    A:这与表使用的字符集相关,latin1、gbk、utf8、utf8mb4编码存放一个字符分别需要占1、2、3、4个字节,同时还要考虑到去除其他字段的占用影响。

    实践出真知,可以简单试一下之后再下结论。


    往期热文推荐:


    「技术架构精进」专注架构研究,技术分享

    Thanks for reading!

    展开全文
  • select max(TO_NUMBER(a.id)) from table a;

    select    max(TO_NUMBER(a.id))   from   table   a; 
     

    展开全文
  • 如果不转的话查询的会有问题 select MAX(CAST(userNo as SIGNED INTEGER))...————varchar 转 int cast(id as signed integer) 或者cast(id as unsigned integer) mysql无符号和有符号的区别 无符号unsigned...
  • mysql中获取varchar类型数据的最大值

    千次阅读 2019-03-06 15:01:51
    转载: ... select MAX(CAST(userNo as SIGNED INTEGER)) from userInfo ;...————varchar 转 int  cast(id as signed integer) 或者 cast(id as unsigned integer) ---------------------   
  • 首先表中dtime的类型是varchar(至于为何是varchar可能是领导说话“一言九鼎”吧) 表中的数据是按照dtime的倒序排序的,从中可以看到mysql再对varchar类型进行排序的时候,是按照位进行比较的。比如7>6,那么7>
  • mysql varchar最大长度多少

    千次阅读 2018-06-08 13:14:44
    最近去面试问了一个问题,mysql...一般是utf-8,那么varchar最大长度不能超过21845。刚刚查下博客最长长度也是2w字,赶脚是这个原因。所以现在回答面试问题,业务中有什么东西会超过2w字的吗,除了博客这些长篇章的...
  • show parameter MAX_STRING_SIZE standard:代表12c之前的长度限制,即varchar2和nvarchar2 4是4000 ... extended:代表12c 32k strings新特性,varchar2、nvarchar2、raw最大长度是32767,即32kb 由数据库参...
  • 经过反复测试,最大值那个错误,官网说法最大值是65535bytes,utf8mb4每个字符占4个bytes,最大值应该为16383.75(如图)但是,如果你一张表中有多个字段都为varchar,是所有varchar字段总和不能超过16383!...
  • SELECT MAX(CAST(no AS SIGNED)) FROM sys_user    找到varchar类型的数字中( 比如 1011001)的最大值。 no 代表的是具体的字段。 as signed 是固定的写法
  • MySQL中char与varchar区别,varchar最大长度是多少? 一、首先来说下字符与字节的区别: 字符与字节它们完全不是一个位面的概念,所以两者之间没有“区别”这一说法。在不同编码里,字符和字节的对应关系是不同的...
  • 一个varchar字段直接用MAX()函数,或直接用order_by 来取最大值,那取出来的结果只会是9开头的字符串(如9,15这种情况), 想要取正确的最大值可以利用cast()函数,将varchar类型转换为integer类型。 实例: ...
  • oracle中varchar类型的最大长度

    千次阅读 2016-01-02 18:00:19
    关于Oracle Database中的字段的VARCHAR2类型的最大长度为4000,我们再来看看PL/SQL中VARCHAR2变量类型,如下官方文档所示,它的最大字节长度为32767,所能容纳的字符个数取决于字符集。
  • MySQL中varchar最大长度是多少?

    千次阅读 2012-08-25 22:53:55
    varchar(20),指的是20字节,如果存放UTF8汉字时,只能存6个(每个汉字3字节) 5.0版本以上,varchar(20),指的是20字符,无论存放的是数字、字母还是UTF8汉字(每个汉字3字节),都可以存放20个,最大大小是65532...
  • ORACLE VARCHAR2最大长度问题 http://www.cnblogs.com/kerrycode/p/3833746.html OJDBC版本区别 [ojdbc14.jar,ojdbc5.jar和ojdbc6.jar的区别] http://www.cnblogs.com/lteal/p/5680430.html ORA-01461: 仅能...
  • mysql 获取varchar类型数字最大值

    千次阅读 2017-10-30 10:26:56
    SELECT MAX(CAST(no AS SIGNED)) FROM sys_user ;
  • MySQL数据类型定义的: 1、整型 MySQL数据类型 含义(有符号) tinyint(m) 1个字节 范围(-128~127) smallint(m) 2个字节 范围(-32768~32767) mediumint(m) 3个字节 范围(-8388608~8388607) ...
  • oracle 字符串数字最大值问题

    千次阅读 2017-11-30 09:38:33
    当查询一个字段的最大值时,如果该字段是字符串类型会出现 查到9比10大的写法:(排序也会出现此类现象) SELECT MAX(ID) AS ID FROM tableName 正确的写法要转换为数字类型: SELECT MAX(CAST(ID AS INT))...
  • ORACLE VARCHAR2最大长度问题 url:http://www.cnblogs.com/kerrycode/p/3833746.html 2014-07-09 15:53 by 潇湘隐者, VARCHAR2数据类型的最大长度问题,是一个让人迷惑的问题,因为VARCHAR2既分PL/SQL Data ...
  • varchar字段最大值是多少 latin1字符集编码下 utf8字符集编码下 utf8mb4字符集编码下 总结 背景 你是否知道MySQL中的varchar字段类型最大能够存储多少数据?它的最大长度是多少?为什么有时候定义一个...
  • varchar和char 的区别,varchar最大长度

    千次阅读 2019-07-04 15:39:43
    5.0版本以上,varchar(20),指的是20字符,无论存放的是数字、字母还是UTF8汉字(每个汉字3字节),都可以存放20个,最大大小是65532字节 二. varchar和char 的区别: char是一种固定长度的类型,varcha...
  • 【mysql】 varchar类型id,取最大值

    千次阅读 2017-05-09 15:07:31
    select max(id+0) as maxid from question WHERE del='0'
  • MySQL VARCHAR最大大小是多少?

    千次阅读 2020-08-16 09:01:17
    I would like to know what the max size is for a MySQL VARCHAR type. 我想知道MySQL VARCHAR类型的最大大小是多少。
  • 数据库varchar长度对效率的影响

    千次阅读 2019-10-18 14:46:45
    开发中发现某个表varchar长度被定为600、2000等较大的长度。 虽然varchar在存储相同字符时占用大小是一样的,但是mysql在存储时会分配一定大小的内存块来存储,导致查询时效率非常差。 将长度改为适应大小后,查询...
  • 有道面试题:若一张表中只有一个字段VARCHAR(N)类型,utf8编码,则N最大值为多少? 先明白计算的一些规则限制 4.0版本以下,varchar(20),指的是20字节,如果存放UTF8汉字时,只能存6个(每个汉字3字节)  5.0版本...
  • VARCHAR最大长度、字符串类型选择,用MySQL的人中十之七八是不清楚的。网上文章鱼目混珠,以讹传讹居多。 本文不止介绍了原理,还提供了案例手把手教你自己分析,彻底解决你的疑惑

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 129,422
精华内容 51,768
关键字:

varchar最大值