mysql dcn_Mysql varchar(max)

设计数据库时,不禁有这样的疑问,varchar()最大可以设置多大呢?与什么有关呢?

字符集

为什么要有字符集?

简单讲,数据在网络上传输与硬盘中储存,都是以二进制的形式存在的。我们熟知的文字、图片以及视频想要存储与传输,必然需要一套规则,使其成为可以被储存和传输的二进制数据,而字符集则是文字编解码的规则。

详情可参考字符编码的历史演变。

在数据的储存上,mysql提供了不同的字符集支持。

查看mysql支持的字符集:

mysql> show character set;

+----------+---------------------------------+---------------------+--------+

| Charset | Description | Default collation | Maxlen |

+----------+---------------------------------+---------------------+--------+

| armscii8 | ARMSCII-8 Armenian | armscii8_general_ci | 1 |

| ascii | US ASCII | ascii_general_ci | 1 |

...

| gb18030 | China National Standard GB18030 | gb18030_chinese_ci | 4 |

| gb2312 | GB2312 Simplified Chinese | gb2312_chinese_ci | 2 |

| gbk | GBK Simplified Chinese | gbk_chinese_ci | 2 |

| utf16 | UTF-16 Unicode | utf16_general_ci | 4 |

| utf16le | UTF-16LE Unicode | utf16le_general_ci | 4 |

| utf32 | UTF-32 Unicode | utf32_general_ci | 4 |

| utf8 | UTF-8 Unicode | utf8_general_ci | 3 |

| utf8mb4 | UTF-8 Unicode | utf8mb4_0900_ai_ci | 4 |

+----------+---------------------------------+---------------------+--------+

41 rows in set (0.01 sec)

Mysql 提供了server、database、table、column级字符集设置。

字符集规则是可以继承的,也就是说:

column 没有设置则继承 table 的字符集设置。

table 没有设置则继承 database 的字符集设置。

database 没有设置则继承 server 的字符集设置。

查看全局字符集设置:

mysql> show global variables like'%character_set%';

+--------------------------+--------------------------------+

| Variable_name | Value |

+--------------------------+--------------------------------+

| character_set_client | utf8mb4 |

| character_set_connection | utf8mb4 |

| character_set_database | utf8mb4 |

| character_set_filesystem | binary |

| character_set_results | utf8mb4 |

| character_set_server | utf8mb4 |

| character_set_system | utf8 |

| character_sets_dir | /usr/share/mysql-8.0/charsets/ |

+--------------------------+--------------------------------+

8 rows in set (0.01 sec)

note:字符集设置不当会出现汉字乱码。

char与varchar

char:固定长度类型,char(n)则表示只能储存n字节数据,不足n则在末尾填充空格,最大存储255字符。占用储存空间n × 字符集最大占用字节。

varchar:可变长度类型,varchar(n)则表示可存储char_length(n)长度的字符,储存空间占用(字符集最大占用 × n + 1 or 2长度字节),字节数 > 255 时用2字节表示长度。

length() 与 char_length()

char_length():返回字符长度,与空间占用大小无关

mysql> select char_length('a'),char_length('1'),char_length('hello world'),char_length('你好');

+------------------+------------------+----------------------------+-----------------------+

| char_length('a') | char_length('1') | char_length('hello world') | char_length('你好') |

+------------------+------------------+----------------------------+-----------------------+

| 1 | 1 | 11 | 2 |

+------------------+------------------+----------------------------+-----------------------+

1 row in set (0.00 sec)

length(): 返回占用字节数

mysql> select length('a'),length('1'),length('hello world'),length('我'),length("你好"),length('🤤');

+-------------+-------------+-----------------------+---------------+------------------+-------------+

| length('a') | length('1') | length('hello world') | length('我') | length("你好") | length('?') |

+-------------+-------------+-----------------------+---------------+------------------+-------------+

| 1 | 1 | 11 | 3 | 6 | 4 |

+-------------+-------------+-----------------------+---------------+------------------+-------------+

1 row in set (0.00 sec)

utf8mb4是mysql在5.5之后新增的字符集编码mb4就是most bytes 4的意思,可编码4字节字符。所以utf8不支持emoji在utf8mb4解决了。

不同的字符集的空间占用。

创建一个字符集为utf8mb4的表

mysql> create table test_utf8mb4 (cu varchar(10), dcu varchar(10),cn varchar(10),dcn varchar(10),smy varchar(10)) charset=utf8mb4;

Query OK, 0 rows affected (0.02 sec)

// 插入一条数据

mysql> insert into test_utf8mb4 (`cu`,`dcu`,`cn`,`dcn`,`smy`) values ('a','hello','你',"你好",'🤤');

Query OK, 1 row affected (0.00 sec)

mysql> select length(cu),length(dcu),length(cn),length(dcn),length(smy) from test_utf8mb4;

+------------+-------------+------------+-------------+-------------+

| length(cu) | length(dcu) | length(cn) | length(dcn) | length(smy) |

+------------+-------------+------------+-------------+-------------+

| 1 | 5 | 3 | 6 | 4 |

+------------+-------------+------------+-------------+-------------+

1 row in set (0.00 sec)

在utf8mb4字符集中,英文数字占1个字节,中文占用3个字节,emoji占用4字节。

创建一个字符集为gbk的表

mysql> create table test_gbk (cu varchar(10), dcu varchar(10),cn varchar(10),dcn varchar(10),smy varchar(10)) charset=gbk;

Query OK, 0 rows affected (0.02 sec)

// 插入一条数据

mysql> insert into test_gbk (`cu`,`dcu`,`cn`,`dcn`,`smy`) values ('a','hello','你',"你好",'🤤');

ERROR 1366 (HY000): Incorrect string value: '\xF0\x9F\xA4\xA4' for column 'smy' at row 1

// emoji是一个不正确的值,可以看到smy是一个4字节字符。

mysql> insert into test_gbk (`cu`,`dcu`,`cn`,`dcn`) values ('a','hello','你',"你好");

Query OK, 1 row affected (0.00 sec)

mysql> select length(cu),length(dcu),length(cn),length(dcn),length(smy) from test_gbk;

+------------+-------------+------------+-------------+-------------+

| length(cu) | length(dcu) | length(cn) | length(dcn) | length(smy) |

+------------+-------------+------------+-------------+-------------+

| 1 | 5 | 2 | 4 | NULL |

+------------+-------------+------------+-------------+-------------+

1 row in set (0.00 sec)

gbk的字符集中,英文数字占1字节,中文占2字节,且只能保存2字节及以下字符。

在mysql中,char(n) or varchar(n)中的n代表的是可插入的字符长度,非字节空间。

既然n指的是字符长度,char(n)最大255,那么varchar(n)最大可以设置为多少呢?

行大小限制

在mysql中,mysql有65535字节的最大行大小限制。也就是说,所有字段占用的空间都被包含在65535字节中。

新建一个varchar(65535)的表

mysql> create table long_var (v varchar(65535) not null);

ERROR 1074 (42000): Column length too big for column 'v' (max = 16383); use BLOB or TEXT instead

// 报错,提示最大值为16383

16383 * 4 = 65532,还有3字节空间呢?

这样看起来并不直观,utf8mb4占用4字节空间,不如用latin1代替,latin1只占用一字节。

mysql> create table long_var (v varchar(65535)) charset=latin1;

ERROR 1118 (42000): 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

// 失败,提示最大行大小为65535。

// 对了,varchar()还有2个字节的长度标识位。

mysql> create table long_var (v varchar(65533)) charset=latin1;

ERROR 1118 (42000): 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

// 65533 还报错?

mysql> create table long_var (v varchar(65533) not null) charset=latin1;

Query OK, 0 rows affected (0.02 sec)

// 同样65533成功了,接下来就是找不同的时间了。

第二条语句多了一条not null 的语句,在mysql中行大小除了数据列长度,还包括可空标识,即NULL标识。

如果有一个列允许为空,则需要1 bit来标识,每8 bits的标识会组成一个字段,该字段会存放在每行最开始的位置。可空表示是行内共享的。

那么,新建一个可空列的表,字段长读应设置为65535 - 2字节长度 - 1字节null标识 = 65532;

mysql> create table long_var_32 (v varchar(65532)) charset=latin1;

Query OK, 0 rows affected (0.02 sec)

varchar()的最大长度,受字符集限制,且行内共65535字节的大小,也就是说varchar(65532)只能有一个。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/307009.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ASP.NETCore小技巧:使用测试用户中间件

哈喽大家好,这篇文章其实很早就想写了,因为一直会有小伙伴问到,但是我却始终拿不到好的方案,最近在录制《eShopOnContainer微服务架构》的视频,碰巧就看到了微软官方的代码中也有这方面的需求,而且和我的需…

【招聘(深圳)】华强方特文化科技集团 .NET工程师

.NET高级开发工程师(18-25K)岗位职责:负责系统需求分析与设计;根据业务确定实现方案;对现有系统缺陷提出优化方案;负责系统关键功能开发及维护,保障系统的正常运行;带领指导团队开发…

11座城市,58个.NET最新岗位速览,内推直通面试官!

十一月风雪客,十二月乘衣归!各个大厂秋招进行时,你行动了吗?借着这阵风,今天为大家提供一批.NET开发岗位内推!58个优质的.NET开发岗位年薪过万到百万不等,总有一个适合你!包含全国各…

pdo mysql_PDO MySQL

PDO MySQL如果文章有成千上万篇,该怎样保存?数据保存有多种方式,比如单机文件、单机数据库(SQLite)、网络数据库(MySQL、MariaDB)等等。根据项目来选择,做Web一般采用MySQL,本书也以MySQL为例。自学:1天。假…

C# 8: 可变结构体中的只读实例成员

在之前的文章中我们介绍了 C# 中的 只读结构体(readonly struct)[1] 和与其紧密相关的 in 参数[2]。今天我们来讨论一下从 C# 8 开始引入的一个特性:可变结构体中的只读实例成员(当结构体可变时,将不会改变结构体状态的…

python中valueerror怎么改_如何修复Python ValueError:错误的元数据?

在Ubuntu中运行flexget Python脚本,我收到一个错误:$ flexget series forget "Orange is the new black" s03e01Traceback (most recent call last):File "/usr/local/bin/flexget", line 7, in from flexget import mainFile "…

EntityFramework Core上下文实例池原理

【导读】无论是在我个人博客还是著作中,对于上下文实例池都只是通过大量文字描述来讲解其基本原理,而且也是浅尝辄止,导致我们对其认识仍是一知半解,本文我们摆源码,从源头开始分析希望通过本文从源码的分析&#xff0…

部署Dotnet Core应用到Kubernetes(一)

最近闲了点,写个大活:部署Dotnet应用到K8s。写在前边的话一直想完成这个主题。但这个主题实在太大了,各种拖延症的小宇宙不时爆发一下,结果就拖到了现在。这个主题,会是一个系列。在这个系列中,我会讨论将应…

java 配置参数_给你的JAVA程序配置参数(Properties的使用)

我们在写JAVA程序时,很多时候运行程序的参数是需要动态改变的测试时一系列参数,运行时一系列参数又或者数据库地址也需要配一套参数,以方便今后的动态部署这些变量的初始化,我们在写小DEMO时完全可以写死在JAVA文件中但程序需要发…

JAVA实验报告九异常处理_Java课后练习9(异常处理)

动手动脑1:import javax.swing.*;class AboutException {public static void main(String[] a){int i1, j0, k;ki/j;try{k i/j; // Causes division-by-zero exception//throw new Exception("Hello.Exception!");}catch ( ArithmeticException e){System.out.print…

asp.net core web api之异常

官方建议用app.UseExceptionHandler("/error")来集中处理异常&#xff0c;本例是一个具体的应用。比如项目中有一个ViewModel&#xff0c;要求Name最大长度为5/// <summary>/// 用户模型/// </summary>public class UserModel{/// <summary>/// ID…

java 实现 指派_TAP任务指派问题的汇编实现

近六周的课程设计&#xff0c;编了一个四百行的汇编程序&#xff0c;编的过程很不顺利&#xff0c;遇到种种意想不到的困难&#xff0c;但最终能够实现&#xff0c;可谓欣喜若狂&#xff0c;这期间学到了好多好多&#xff0c;遇到问题怎么精下心来解决&#xff0c;同时对汇编的…

.NET 5.0正式发布,有什么功能特性(翻译)

我们很高兴今天.NET5.0正式发布。这是一个重要的版本—其中也包括了C# 9和F# 5大量新特性和优秀的改进。微软和其他公司的团队已经在生产和性能测试环境中开始使用了。这些团队向我们反馈的结果比较令人满意&#xff0c;它证明了对性能提升及降低Web应用托管成本的机会有积极的…

Java 重写 多态性_java多态性重写overriding和重载overloading的区别

一、概述就Java而言&#xff0c;当有人问&#xff1a;什么是多态&#xff1f;将重载或重写的区别解释为一个可以接受的答案&#xff1f;如果您有一个抽象基类&#xff0c;它定义了一个没有实现的方法&#xff0c;并且您在子类中定义了该方法&#xff0c;那该方法是否仍然覆盖&a…

简单聊聊C#中lock关键字

为了避免多个线程同时操作同一资源&#xff0c;引起数据错误&#xff0c;通常我们会将这个资源加上锁&#xff0c;这样在同一时间只能有一个线程操作资源。在C#中我们使用lock关键字来锁定资源&#xff0c;那lock关键字是如何实现锁定的呢&#xff1f;我们先看一段代码&#xf…

idea如何导入java工程_Eclipse java web项目 ,导入IntelliJ IDEA 完整操作!

或许你用惯了Eclipse&#xff0c;有点排斥其他工具了&#xff0c;你写框架的时候&#xff0c;编译速度是不是特别慢啊&#xff1f;有时候还超过45秒&#xff0c;自动取消运行&#xff01;有时候代码是正常的&#xff0c;却无端端报错&#xff1f;下午吃个饭回来又好了&#xff…

行业思考 | 互联网对传统行业的降维打击

【行业思考】| 作者 / Edison Zhou这是EdisonTalk的第301篇原创内容在周一发布的推文《我在传统行业做数字化转型之预告篇》中&#xff0c;我提到互联网的发展和和竞争对传统行业起到了降维打击的作用&#xff0c;于是就有童鞋私下问我&#xff0c;为何这么说。今天就跟你聊聊这…

java aio复制文件_java复制文件的4种方式及拷贝文件到另一个目录下的实例代码...

尽管Java提供了一个可以处理文件的IO操作类。 但是没有一个复制文件的方法。 复制文件是一个重要的操作,当你的程序必须处理很多文件相关的时候。 然而有几种方法可以进行Java文件复制操作,下面列举出4中最受欢迎的方式。1. 使用FileStreams复制这是最经典的方式将一个文件的内…

BCVP开发者说第一期:Destiny.Core.Flow

沉静岁月&#xff0c;淡忘流年1项目简介Destiny.Core.FlowDestiny.Core.Flow是基于.NetCore平台&#xff0c;轻量级的模块化开发框架&#xff0c;Admin管理应用框架&#xff0c;旨在提升团队的快速开发输出能力&#xff0c;由常用公共操作类&#xff08;工具类、帮助类&#xf…

.NET Core 取消令牌:CancellationToken

在 .NET 开发中&#xff0c;CancellationToken&#xff08;取消令牌&#xff09;是一项比较重要的功能&#xff0c;掌握并合理的使用 CancellationToken 可以提升服务的性能。特别在异步编程中&#xff0c;我常常会以创建 Task 的方式利用多线程执行一些耗时或非核心业务逻辑&a…