zoukankan      html  css  js  c++  java
  • MySQL学习笔记_关于MySQL的字符类型VARCHAR长度知识总结

    MySQL学习笔记_关于MySQL的字符类型VARCHAR长度知识总结

    一.VARCHAR存储和行长度限制

    1.VARCHAR(N)中,N指的是字符的长度,VARCHAR类型最大支持65535,指的是65535个字节,但并不支持65535长度的varchar,65535中应该包含了所有字段的长度、变长字段长度标示位、NULL标示位的累计。其中内容开头用1到2个字节表示实际长度(长度超过255时需要2个字节)。所以还有别的开销,实际能存放的长度为65532.

    (MySQL数据库的varchar类型在5.0.3以下的版本中的最大长度限制为255,其数据范围可以是0~255)

    wps_clip_image-1585

    2.因为null标示位占用了一个字节,所以可以去掉not null限制。

    wps_clip_image-2415

    3.MySQL要求一个行的定义长度不能超过65535 是指所有列的长度总和不能超过65535.如果列的长度总和超过这个长度,依然无法创建.

    wps_clip_image-4025

    二.VARCHAR长度的编码限制

    1.概述

    字符类型若为gbk,每个字符最多占2个字节,最大长度不能超过32766;

    字符类型若为utf8,每个字符最多占3个字节,最大长度不能超过21845。

    若定义的时候超过上述限制,则varchar字段会被强行转为text类型,并产生warning。

    2.举例

    (1)若一个表只有一个varchar类型,如定义为

    create table t4(c varchar(N)) charset=gbk;

    则此处N的最大值为(65535-1-2)/2= 32766。

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

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

    除2的原因是字符编码是gbk。

    (2) 若一个表定义为

    create table t4(c int, c2 char(30), c3 varchar(N)) charset=utf8;

    则此处N的最大值为 (65535-1-2-4-30*3)/3=21812

    减1和减2与上例相同;

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

    减30*3的原因是char(30)占用90个字节,编码是utf8。

    如果被varchar超过上述的b规则,被强转成text类型,则每个字段占用定义长度为11字节,当然这已经不是“varchar”了。

    三.关于SQL模式

    在MySQL中,SQL模式常用来解决下面几类问题:

    1.通过设置SQL Mode,可以完成不同严格程度的数据校验,有效地保障数据准确性。

    2.通过设置SQL Mode为ANSI模式,来保证大多数SQL符合标准的SQL语法,这样应用在不同数据库之间进行迁移时,则不需要对业务SQL进行较大的修改。

    3.在不同数据库之间进行数据迁移之前,通过设置SQL Mode可以使MySQL上的数据更方便地迁移到目标数据库中。

    查看当SQL模式

    mysql>select @@sql_mode;

    wps_clip_image-10668

    STRICT_TRANS_TABLES(严格模式) 实现数据的严格校验,使错误数据不能插入表中.

    如果将sql_mode设为'',则可能会出现可以建立表,但是会有一条警告信息,

    mysql>set session sql_mode='';

    mysql>create table test4(a varchar(25000)) charset=utf8;

    mysql>show warnings;

    警告信息提示了,之所以可以创建,是因为MySQL自动将VARCHAR转换成了Text类型。

    mysql>show create table test4;

    wps_clip_image-32465

    附:

    1.UTF8编码介绍

    http://zh.wikipedia.org/wiki/UTF8

    2.查看字符集方法:

    (1)查看MySQL数据库服务器和数据库MySQL字符集。

    show variables like '%char%'; 

    (2)查看MySQL数据表(table)的MySQL字符集。

    show table status from dbName where name='tableName';

    (3)查看MySQL数据列(column)的MySQL字符集。

    show full columns from tableName;

    参考:http://dinglin.iteye.com/blog/914276

  • 相关阅读:
    进程和线程(一)
    树和二叉树(一)
    栈和队列
    《Learning to Coordinate with Coordination Graphs in Repeated Single-Stage Multi-Agent Decision Problems》- ICML2018
    简单Socket网络通信
    Spring Websocket实现简易在线聊天功能
    Spring实现WebSocket通信
    Spring中配置使用slf4j + log4j
    构建web应用之——文件上传
    构建web应用之——SpringMVC实现CRUD
  • 原文地址:https://www.cnblogs.com/huligong1234/p/2556651.html
Copyright © 2011-2022 走看看