相信这个问题也会困扰不少人,尤其是使用过其它数据库(如Oracle)的人,之前我也没有太在意这个问题,再加上一些书籍和网上的文章讲的不够细致,又没测试过,导致我一直理解错误。下面通过实例来解释,在开始之前先简单介绍下字符和字节的区别。
字符 人们使用的记号,抽象意义上的一个符号。一个汉字和英文就是一个字符,如'1', '中', 'a', '$', '¥',…… 
字节 计算机中存储数据的单元,一个8位的二进制数,是一个很具体的存储空间,如0x01, 0x45, 0xFA,……
详细的可以参考http://www.regexlab.com/zh/encoding.htm,正确理解相关概念还是很重要的。
好了,如果你已经理解了字符和字节的区别,下面就容易多了。
环境:CentOS5.x,MySQL5.1.x
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;

  1. +----+--------------------------------+--------------+-------------------+
  2. | id | name                           | length(name) | char_length(name) |
  3. +----+--------------------------------+--------------+-------------------+
  4. |  1 | 1234567890                     |           10 |                10 |
  5. |  2 | 一二三四五六七八九十              |           30 |                10 |
  6. |  3 | abcdefghig                     |           10 |                10 |
  7. +----+--------------------------------+--------------+-------------------+
  8. 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;

  1. +----+----------------------+--------------+-------------------+
  2. | id | name                 | length(name) | char_length(name) |
  3. +----+----------------------+--------------+-------------------+
  4. |  1 | 1234567890           |           10 |                10 |
  5. |  2 | 一二三四五六七八九十    |           20 |                10 |
  6. |  3 | abcdefghig           |           10 |                10 |
  7. +----+----------------------+--------------+-------------------+
  8. 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;

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

MySQL的varchar定义长度到底是字节还是字符的更多相关文章

  1. 【转】MySQL中varchar最大长度是多少?

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

  2. MySQL中varchar最大长度是多少?

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

  3. MySQL中varchar最大长度是多少

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

  4. int(11)最大长度是多少,MySQL中varchar最大长度是多少(转)

    int(11)最大长度是多少,MySQL中varchar最大长度是多少? int(11)最大长度是多少? 在SQL语句中int代表你要创建字段的类型,int代表整型,11代表字段的长度. 这个11代表 ...

  5. MySql中的varchar长度究竟是字节还是字符

    今天在设计表的时候,遇到个小问题,由于不知道未来将要存储的数据有多长(数据是通过第三方http接口提供的,根据sample显示,数据大概是如下:) 也就是6个字符. 我在设计表的时候,有点犹豫,本来准 ...

  6. 超过varchar定义长度

    mysql> select version();+------------+| version() |+------------+| 5.1.73-log |+------------+1 ro ...

  7. mysql的varchar字段可以存储多少个中文字符

    创建数据库,并创建一张表mytb进行测试 ******************************************************************************* ...

  8. 定义Java类实现字节流转字符流

    package com.buaa.comparable; import java.io.BufferedReader;import java.io.File;import java.io.FileIn ...

  9. Mysql VARCHAR的最大长度到底是多少

    MySQL 数据库的varchar类型在4.1以下的版本中的最大长度限制为255,其数据范围可以是0~255或1~255(根据不同版本数据库来定).在 MySQL5.0以上的版本中,varchar数据 ...

随机推荐

  1. 微软数学库XNAMATH(DirectXMath)

    这篇文章只是对着MSDN文档的一些吐槽和总结记录,个人笔记之类的 运行库与头文件 老实说,这个数学库微软还是更像蛮频繁的,我这里有的最早版本是伴随DX9的,在这个头文件里面 最近在使用DXUT,顺便也 ...

  2. python(6)-执行shell命令

    可以执行shell命令的相关模块和函数有: os.system os.spawn* os.popen*          --废弃 popen2.*           --废弃 commands.* ...

  3. 关于 VS2012 创建 MVC4 Empty 项目的一个小问题

    今天下午发现一个新建的项目工作异常,主要表现为应该返回JSON的Action没有返回JSON字符串,而是返回了JsonResult的对象名,即字符串“System.Web.Mvc.JsonResult ...

  4. CF Watto and Mechanism (字典树+深搜)

    Watto and Mechanism time limit per test 3 seconds memory limit per test 256 megabytes input standard ...

  5. 【解决】该任务映像已损坏或已篡改。(异常来自HRESULT:0x80041321)

    把系统升级到Windows 10,体验了一番Windows 10.感觉不怎么好用退回到了Windows 7,发现我原来自定义的任务计划没有按时执行,于是打开任务计划,弹出了下面的对话框[该任务映像已损 ...

  6. C#/.NET使用HttpWebRequest、SqlBulkCopy从API获取数据批量插入DB

    小弟新手程序员一枚,代码技术和文章水平均不才.所写文章均为对自己所写所学代码的简单记录,可能对于老手程序员营养价值不高,望莫见怪. 我工作上有个需求:从某处API接口上获取数据(大约1W条而已)并插入 ...

  7. html5 js os build

    1.NodeJS6.6 install   https://nodejs.org/en/ c:\nodejs>npm install -g grunt-cliC:\Users\police\Ap ...

  8. 每天一道LeetCode--326. Power of Three

    Given an integer, write a function to determine if it is a power of three. Follow up:Could you do it ...

  9. sql常识-union

    SQL UNION 操作符 UNION 操作符用于合并两个或多个 SELECT 语句的结果集. 请注意,UNION 内部的 SELECT 语句必须拥有相同数量的列.列也必须拥有相似的数据类型.同时,每 ...

  10. oracle trunc 函数处理日期格式

    select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') from dual;  --显示当前时间 2011-12-29 16:24:34 select trun ...