首页 > 数据库 >MYSQL varchar和nvarchar一些学习

MYSQL varchar和nvarchar一些学习

时间:2024-01-03 14:06:19浏览次数:32  
标签:00 varchar 31 61 62 63 MYSQL nvarchar

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的相关信息了.



标签:00,varchar,31,61,62,63,MYSQL,nvarchar
From: https://blog.51cto.com/u_11529070/9084319

相关文章

  • SQLServer的varchar与nvarchar的学习之二
    SQLServer的varchar与nvarchar的学习之二背景昨天简单总结了多种数据库varchar和nvarchar的区别与关系今天想着能够分析一下数据库文件.计划使用winhex查看数据文件,简单进行学习过程创建数据库和表,然后进行一些测试,进行简单测试判断.createdatabasezhaobshcreateta......
  • 凡是有但是-varchar和nvarchar的初步学习之一
    凡是有但是-varchar和nvarchar的初步学习之一背景高应用开发,在涉及到国内国外的问题时,重要的事情有两个:时区转换,字符集转换.时区转换虽然是很难理清楚,各种规范不统一的事情但是字符集转换更加扯淡.如果是一种数据库,一种字符集可能还好说现在面临的是多种数据库:......
  • oracle和mysql在数据引擎上的本质区别
    Oracle和MySQL是两种不同的关系型数据库管理系统(RDBMS),它们在数据引擎上有一些本质区别。以下是它们之间的一些主要区别:开发商和许可协议:Oracle:由Oracle公司开发,采用商业许可协议。通常需要购买许可证,并且有较高的成本。MySQL:由Oracle公司的子公司MySQLAB开发,采用开源许可协议(通......
  • mysql8.0存储过程
    1、存储过程概述1.1、理解含义:存储过程的英文是StoredProcedure。它的思想很简单,就是一组经过预先编译的SQL语句的封装。执行过程:存储过程预先存储在MySQL服务器上,需要执行的时候,客户端只需要向服务器端发出调用存储过程的命令,服务器端就可以把预先存储好的这一系列SQL......
  • 还在用 Navicat?试试这款正版 MySQL 客户端,真香!
    最近看到一款数据库客户端工具,DataGrip,是大名鼎鼎的JetBrains公司出品的,就是那个出品IntellijIDEA的公司。DataGrip是一款数据库管理客户端工具,方便连接到数据库服务器,执行sql、创建表、创建索引以及导出数据等。之前试用的客户端工具是dbvisualizer,但是在试用了DataGrip以后,我就......
  • MySQL中CASE WHEN THEN用法
    MySQL中CASEWHENTHEN用于分类统计1、创建一个表createtableuser(   idintauto_incrementprimarykey,   agetinyintunsignednotnull); 2、添加一些数据insert intouser(age)values(12),(15),(20),(30),(35),(19),(24),(8),(61),(14);3、CASEWHENTHENselec......
  • MySQL数据库必知,满满干货!
    1、关于数据库1.1数据库技术特点数据结构化数据共享数据独立性高数据统一管理1.2区分数据库、数据库管理系统、数据库系统数据库:一个存在于计算机存储设备上的数据集合,该集合中的数据按照一定的数据模型进行组织、描述和存储。数据库管理系统:一种介于用户和操作系统之间的数据库......
  • mysql 聚簇索引和非聚簇索引
    聚簇索引和非聚簇索引是MySQL中的两种索引类型,它们在数据存储和检索方面有所不同。聚簇索引是指数据行的物理顺序与索引的逻辑顺序一致。在MySQL中,每个表只能有一个聚簇索引,通常是主键索引。聚簇索引的特点包括:将数据行和索引存储在一起,因此索引的顺序也决定了数据行的存储顺序。支......
  • MySQL下count(*)、count(1)和count(字段)的查询效率比较
    InnoDB存储引擎COUNT(*)和COUNT(1)都是对所有结果进行计算。如果有WHERE子句,则是对所有符合筛选条件的数据行进行统计;如果没有WHERE子句,则是对数据表的数据行数进行统计。因为COUNT(*)和COUNT(1)本质上没有区别,执行的复杂度都是O(N),也就是采用全表扫描,进行循环+计数的方式进行统计......
  • MySQL yum安装常见报错
    yum安装MySQL报公钥尚未安装解决方案1:将yum文件里的mysql-community.repo,编辑,gpgcheck=0解决方案二:更新RPM-GPG-KEY-mysql文件......