MYSQL varchar和nvarchar一些学习


背景

先试用 utfmb3的格式进行一下简单验证

注意脚本都是一样的. 

create database  zhaobsh ;
use zhaobsh ;
create table zhaobsh (zhaobshvarchar varchar(30),zhaobshnvarchar nvarchar(30)) ;
insert into zhaobsh values ('123abc','123abc') ;
insert into zhaobsh values ('abcd赵1234','abcd赵1234') ;
insert into zhaobsh values ('abcde한국12345','abcde한국12345') ;
insert into zhaobsh values ('abcde한국12345',N'abcde한국12345') ;

winhex的显示结果

Offset      0  1  2  3  4  5  6  7   8  9  A  B  C  D  E  F

00010090            31 32 33 61 62  63 31 32 33 61 62 63 0B      123abc123abc
000100A0 0B 00 00 00 18 00 31 00 00 00 02 D0 C4 00 00 00 1 心
000100B0 3C A8 0E 81 00 00 0E A2 01 10 61 62 63 64 E8 B5 <? ? abcd璧
000100C0 B5 31 32 33 34 61 62 63 64 E8 B5 B5 31 32 33 34 ?234abcd璧?234
000100D0 10 10 00 00 00 20 00 3B 00 00 00 02 D0 C5 00 00 ; 信
000100E0 00 3C A8 13 82 00 00 02 D6 01 10 61 62 63 64 65 <?? ? abcde
000100F0 ED 95 9C EA B5 AD 31 32 33 34 35 61 62 63 64 65 頃滉淡12345abcde
00010100 ED 95 9C EA B5 AD 31 32 33 34 35 10 10 00 00 00 頃滉淡12345
00010110 28 FF 5D 00 00 00 02 D0 C6 00 00 00 3C A8 14 81 (] 衅 <?
00010120 00 00 00 8B 01 10 61 62 63 64 65 ED 95 9C EA B5 ? abcde頃滉?
00010130 AD 31 32 33 34 35 61 62 63 64 65 ED 95 9C EA B5 ?2345abcde頃滉?
00010140 AD 31 32 33 34 35 ?2345 需要注意 全新的一个数据库就见了一个表 会产生一个ibd文件
ibd文件大小为 112KB 这个存储的位置在 76页/136页
存储的位置也比较奇怪.

MySQL的结果分析

1. 关于ASCII字符集
MySQL采用 utf8mb3的字符集时
不管是 varchar和nvarchar, 其实存储ASCII的编码 使用的位置和大小是完全一样的:
31 32 33 61 62 63 31 32 33 61 62 63
不会因为是 nvarchar 就浪费空间. 跟SQLServer的处理方式不一样. 2. 关于中文汉字
61 62 63 64 E8 B5 B5 31 32 33 34 61 62 63 64 E8 B5 B5 31 32 33 34 因为 赵的 UTF8的编码为:
赵 Unicode (UTF-8) utf-8 E8B5B5
这一点与SQLServer的存储页面是不一样的. SQLServer存储的是 unicode的具体数值:
赵 Unicode utf-16 758D 3. 关于韩文:
61 62 63 64 65 ED 95 9C EA B5 AD 31 32 33 34 35 61 62 63 64 65 ED 95 9C EA B5 AD 31 32 33 34 35 可以看到 韩文的
한국 Unicode (UTF-8) utf-8 ED959CEAB5AD varchar 和 nvarchar的存储其实是完全一样的.

结论

MySQL的 nvarchar其实就是掩人耳目的
MySQL的nvarchar 其实就是 varchar的完全一样的一个别名 这一点PG数据库比较有操守, 觉得没必要有 nvarchar 就没有实现. SQLServer的国际化其实比 utf8字符集还要早
而且是一个很重视商业和向前兼容的数据库.
所以sqlserver的表现与PG和MySQL其实完全不一样.
SQLServer接纳utf8也很慢也非常晚. 下一步需要验证一下 信创数据库的varchar和nvarchar的相关信息了.

MYSQL varchar和nvarchar一些学习的更多相关文章

  1. MySQL中char、varchar和nvarchar的区别

    一.char和varchar的区别char是固定长度的,而varchar会根据具体的长度来使用存储空间,另外varchar需要用额外的1-2个字节存储字符串长度.1). 当字符串长度小于255时,用额 ...

  2. sql-char和varchar,nvarchar的区别

    数据类型的比较 char表示的是固定长度,最长n个字 varchar表示的是实际长度的数据类型 比如:如果是char类型,当你输入字符小于长度时,后补空格:而是varchar类型时,则表示你输入字符的 ...

  3. MySQL基础之事务编程学习笔记

    MySQL基础之事务编程学习笔记 在学习<MySQL技术内幕:SQL编程>一书,并做了笔记.本博客内容是自己学了<MySQL技术内幕:SQL编程>事务编程一章之后,根据自己的理 ...

  4. 数据库char varchar nchar nvarchar,编码Unicode,UTF8,GBK等,Sql语句中文前为什么加N(一次线上数据存储乱码排查)

    背景 公司有一个数据处理线,上面的数据经过不同环境处理,然后上线到正式库.其中一个环节需要将数据进行处理然后导入到另外一个库(Sql Server).这个处理的程序是老大用python写的,处理完后进 ...

  5. sql中NVARCHAR(MAX) 性能和占空间分析 varchar(n),nvarchar(n) 长度性能及所占空间分析

    varchar(n),nvarchar(n) 中的n怎么解释: nvarchar(n)最多能存n个字符,不区分中英文. varchar(n)最多能存n个字节,一个中文是两个字节. 所占空间: nvar ...

  6. 答:SQLServer DBA 三十问之一: char、varchar、nvarchar之间的区别(包括用途和空间占用);xml类型查找某个节点的数据有哪些方法,哪个效率高;使用存储 过程和使用T-SQL查询数据有啥不一样;

    http://www.cnblogs.com/fygh/archive/2011/10/18/2216166.html 1. char.varchar.nvarchar之间的区别(包括用途和空间占用) ...

  7. varchar(n),nvarchar(n) 长度、性能、及所占空间的说明

    varchar(n),nvarchar(n) 中的n怎么解释: nvarchar(n)最多能存n个字符,不区分中英文. varchar(n)最多能存n个字节,一个中文是两个字节. 所占空间: nvar ...

  8. varchar和Nvarchar区别

    http://www.cnblogs.com/yelaiju/archive/2010/05/29/1746826.html Unicode字符集就是为了解决字符集这种不兼容的问题而产生的,它所有的字 ...

  9. [转]varchar(n),nvarchar(n) 长度、性能、及所占空间分析

    varchar(n),nvarchar(n) 中的n怎么解释: nvarchar(n)最多能存n个字符,不区分中英文. varchar(n)最多能存n个字节,一个中文是两个字节. 所占空间: nvar ...

  10. varchar与nvarchar的区别

    nvarchar可变长度的Unicode字符数据 varchar可变长度且非 Unicode 的字符数据 举例: varchar(1)   --可以插进入一个数字或者一个字母,如果要插入一个汉字改为v ...

随机推荐

  1. loader编写小记

    此项目在一些大佬的基础上进行了修改,或许能提供一些思路.还在学习中很菜很菜,不足之处还请师傅们多多指点 tips 对shellcode使用AES + Base85加密后以txt保存在远端供下载. 针对 ...

  2. Docker安装 配置

    Docker的技术原理: 1. Linux 命名空间(Namespaces) 进程命名空间:使得每个容器拥有独立的进程空间,互相隔离,不受其他容器影响. 网络命名空间:提供独立的网络栈,每个容器有自己 ...

  3. 通用 Mapper 的批量插入实现

    具体的 SQL 模板实现如下所示: import org.apache.ibatis.mapping.MappedStatement; import tk.mybatis.mapper.MapperE ...

  4. 【Android】深入Binder拦截

    ☞ Github ☜ ☞ Gitee ☜ 说明 Binder作为Android系统跨进程通信的核心机制.网上也有很多深度讲解该机制的文章,如: Android跨进程通信详解Binder机制原理 And ...

  5. FlinkSQL实战开发

    FlinkSQL实战开发 1.基础知识 FlinkSQL分为Table API和SQL API,是架构于Flink Core之上用SQL予以方便快捷地进行结构化数据处理的上层库. 工作流程 SQL和T ...

  6. 认识一下MRS里的“中间人”Alluxio

    摘要:Alluxio在mrs的数据处理生态中处于计算和存储之间,为上层spark.presto.mapredue.hive计算框架提供了数据抽象层,计算框架可以通过统一的客户端api和全局命名空间访问 ...

  7. 华为云VSS漏洞扫描服务之开源组件漏洞检测能力

    摘要:华为云VSS漏洞扫描服务提供针对于Web.主机和软件包的漏洞检测能力. 近日Apache Log4j2漏洞持续发酵,已成为中国互联网2021年年底前最大的安全事件.华为云VSS漏洞扫描服务,提供 ...

  8. 服务器上TIME_WAIT过多怎么处理

    正常情况下,TIME_WAIT是需要存在的 为了保证客户端发送的最后一个ACK报文能够到达服务器,因为这个ACK可能丢失,从而导致处在LAST-ACK状态的服务器收不到对FIN-ACK的确认报文,服务 ...

  9. 【JAVA基础】事务管理

    @Transactional 注解的属性介绍 @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.cl ...

  10. 如何在传统前端项目中进行javascript模块化编程,并引入使用vue.js、element-ui,并且不依赖nodejs和webpack?

    最近接手一个Web三维项目,前后端分离,前端是传统的前端项目,但又是模块化的开发方式,在修改的过程中,我需要做一些增删改查的功能,又想尽可能少的写css.尽可能少的直接操作DOM元素,所以引入了ele ...