MYSQL varchar和nvarchar一些学习

发布时间 2023-12-25 10:56:46作者: 济南小老虎

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