探究MySQL中varchar的定义长度

 更新时间:2015年05月30日 10:07:53   投稿:goldensun  
这篇文章主要介绍了探究MySQL中varchar的定义长度,文中主要对其长度究竟是字节还是字符做出了相关实验,需要的朋友可以参考下

UTF8字符集下:

SQL>create table test(id int auto_increment,name varchar(10),primary key(id));
SQL>insert into test values(null,'1234567890');
Query OK, 1 row affected (0.00 sec)
SQL>insert into test values(null,'一二三四五六七八九十');
Query OK, 1 row affected (0.00 sec)
SQL>insert into test values(null,'abcdefghig');
Query OK, 1 row affected (0.01 sec)
SQL>insert into test values(null,12345678901);
ERROR 1406 (22001): Data too long for column 'name' at row 1
SQL>insert into test values(null,'一二三四五六七八九十1');
ERROR 1406 (22001): Data too long for column 'name' at row 1
SQL>insert into test values(null,'一二三四五六七八九十一');
ERROR 1406 (22001): Data too long for column 'name' at row 1
SQL>select id,name,length(name),char_length(name) from test;

+----+--------------------------------+--------------+-------------------+
 | id | name | length(name) | char_length(name) |
 +----+--------------------------------+--------------+-------------------+
 | 1 | 1234567890 | 10 | 10 |
 | 2 | 一二三四五六七八九十 | 30 | 10 |
 | 3 | abcdefghig | 10 | 10 |
 +----+--------------------------------+--------------+-------------------+
 3 rows in set (0.00 sec)

   GBK字符集下:

SQL>create table test(id int auto_increment,name varchar(10),primary key(id));
SQL>insert into test values(null,'1234567890');
Query OK, 1 row affected (0.00 sec)
SQL>insert into test values(null,'一二三四五六七八九十');
Query OK, 1 row affected (0.00 sec)
SQL>insert into test values(null,'abcdefghig');
Query OK, 1 row affected (0.01 sec)
SQL>insert into test values(null,12345678901);
ERROR 1406 (22001): Data too long for column 'name' at row 1
SQL>insert into test values(null,'一二三四五六七八九十1');
ERROR 1406 (22001): Data too long for column 'name' at row 1
SQL>insert into test values(null,'一二三四五六七八九十一');
ERROR 1406 (22001): Data too long for column 'name' at row 1
SQL>select id,name,length(name),char_length(name) from test;

+----+----------------------+--------------+-------------------+
 | id | name | length(name) | char_length(name) |
 +----+----------------------+--------------+-------------------+
 | 1 | 1234567890 | 10 | 10 |
 | 2 | 一二三四五六七八九十 | 20 | 10 |
 | 3 | abcdefghig | 10 | 10 |
 +----+----------------------+--------------+-------------------+
 3 rows in set (0.00 sec)

   由此可见,varchar定义的长度的单位是字符,哪怕是1个多字节字符也是1个字符,如中文和英文字母都被当作1个字符来对待。

   那么varchar能够定义的最大长度是多少呢?这个和你当前所使用的字符集有关。抛开字符,其最大长度为65535字节(这是最大行大小,由所有列共享),而放在不同的字符集下,能够定义的最大长度就会有所不同,如UTF8下是21845。据说MySQL5中varchar的长度也为字符,而MySQL4中的则为字节,未经证实,感兴趣的有环境可以自己测下。

   顺便补充一下,char数据类型定义的长度也为字符,其最大长度为255。

SQL>create table test(id int auto_increment,name char(5),primary key(id));
Query OK, 0 rows affected (0.09 sec)
SQL>insert into test values(null,'123');
Query OK, 1 row affected (0.00 sec)
SQL>insert into test values(null,'12345');
Query OK, 1 row affected (0.00 sec)
SQL>insert into test values(null,'一二三');
Query OK, 1 row affected (0.00 sec)
SQL>insert into test values(null,'一二三四五');
Query OK, 1 row affected (0.00 sec)
SQL>insert into test values(null,123456);
ERROR 1406 (22001): Data too long for column 'name' at row 1
SQL>insert into test values(null,'一二三四五1');
ERROR 1406 (22001): Data too long for column 'name' at row 1
SQL>select id,name,length(name),char_length(name) from test;

+----+-----------------+--------------+-------------------+
 | id | name | length(name) | char_length(name) |
 +----+-----------------+--------------+-------------------+
 | 1 | 123 | 3 | 3 |
 | 2 | 12345 | 5 | 5 |
 | 3 | 一二三 | 9 | 3 |
 | 4 | 一二三四五 | 15 | 5 |
 +----+-----------------+--------------+-------------------+
 4 rows in set (0.00 sec)

相关文章

  • MySQL数据更新操作的两种办法(数据可视化工具和SQL语句)

    MySQL数据更新操作的两种办法(数据可视化工具和SQL语句)

    MySQL是最常用的数据库,在数据库操作中,基本都是增删改查操作,简称CRUD,下面这篇文章主要给大家介绍了关于MySQL数据更新操作的两种办法,需要的朋友可以参考下
    2023-03-03
  • mysql 8.0.17 解压版安装配置方法图文教程

    mysql 8.0.17 解压版安装配置方法图文教程

    这篇文章主要为大家详细介绍了mysql 8.0.17 解压版安装配置方法图文教程,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-09-09
  • 你有没有遗忘mysql的历史记录

    你有没有遗忘mysql的历史记录

    程序出现了问题,明知道可能是sql语句造成的,但是因为框架的原因,分析起来十分麻烦,于是打算直接查看数据库里面的历史记录.
    2014-09-09
  • 详解MySQL事务的隔离级别与MVCC

    详解MySQL事务的隔离级别与MVCC

    这篇文章主要介绍了MySQL事务的隔离级别与MVCC的相关资料,帮助大家更好的理解和学习使用MySQL,感兴趣的朋友可以了解下
    2021-04-04
  • mysql函数日期和时间函数汇总

    mysql函数日期和时间函数汇总

    这篇文章主要介绍了mysql函数日期和时间函数汇总,日期和时间函数主要用来处理日期和时间值,一般的日期函数除了使用​​date​​​类型的参数外,也可以使用​​datetime​​​或者​​timestamp​​类型的参数,但会忽略这些值的时间部分
    2022-07-07
  • 如何用cmd连接Mysql数据库

    如何用cmd连接Mysql数据库

    如何用cmd连接Mysql数据库,需要的朋友可以参考一下
    2013-03-03
  • 详解MySQL插入和查询数据的相关命令及语句使用

    详解MySQL插入和查询数据的相关命令及语句使用

    这篇文章主要介绍了MySQL插入和查询数据的相关命令及语句使用,包括相关的PHP脚本操作方法讲解也很详细,需要的朋友可以参考下
    2015-11-11
  • Mysql聚合函数的使用介绍

    Mysql聚合函数的使用介绍

    今天的章节我们将要来学习一下 “聚合函数” ;首先我们需要学习聚合函数对数据进行统计分析,比如说求最大值、最小值、平均值之类的场景。但是单纯的使用聚合函数,只能做全表范围的统计分析
    2022-10-10
  • 用于App服务端的MySQL连接池(支持高并发)

    用于App服务端的MySQL连接池(支持高并发)

    这篇文章主要介绍了用于App服务端的MySQL连接池,并支持高并发,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2015-12-12
  • MySQL null与not null和null与空值''''''''的区别详解

    MySQL null与not null和null与空值''''''''的区别详解

    这篇文章主要介绍了MySQL null与not null和null与空值''的区别详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-11-11

最新评论