首页 > 数据库 >SQLServer的varchar与nvarchar的学习之二

SQLServer的varchar与nvarchar的学习之二

时间:2023-12-24 19:24:34浏览次数:35  
标签:00 varchar 31 SQLServer XX 63 nvarchar

SQLServer的varchar与nvarchar的学习之二


背景

昨天简单总结了多种数据库 varchar和nvarchar的区别与关系
今天想着能够分析一下数据库文件.

计划使用winhex 查看数据文件, 简单进行学习

过程

创建数据库和表,然后进行一些测试, 进行简单测试判断.
create database  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')

查询分析器的结果

zhaobsh_varchar zhaobsh_nvarchar
赵XX测试三十个字符的情况 赵XX测试三十个字符的情况赵本帅赵XX
123abc 123abc
abcd赵XX1234 abcd赵XX1234
abcde??12345 abcde??12345
abcde??12345 abcde한국12345

简单分析

nvarchar是字符数. 可以保存字符的个数
varchar是字节数,  汉字的话因为是GBK编码可能要除以2
chinese_prc的排序规则下 韩文是乱码显示.
使用 N开头存储到 nvarchar里面可以正常显示韩文. 
但是需要SQL单独修改一下.  

打开winhex进行查看

先分离数据库,然后复制数据库的数据文件出来.
使用winhex打开数据文件

第一部分 数字和英文:
Offset      0  1  2  3  4  5  6  7   8  9  A  B  C  D  E  F

0011C0B0                                              31 32                 12
0011C0C0   33 61 62 63 31 00 32 00  33 00 61 00 62 00 63      3abc1 2 3 a b c

可以明显看到
varchar的 数字和英文字符, 都是一个字符使用一个字节进行保存.  
nvarchar 使用的是两个字符进行保存,方式是后面补零. 

并且可以看到字段的两个数据时仅仅仅挨着的. 

地区看到 nvarchar 在存储ASCII字符时至少会浪费一倍的存储空间.

中文部分

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

0011C0D0                                     31 00 61 62 63              1 abc
0011C0E0   64 D5 D4 XX XX XX XX 31  32 33 34 61 00 62 00 63   d赵XX1234a b c
0011C0F0   00 64 00 75 8D 2C 67 05  5E 31 00 32 00 33 00 34    d u ,g ^1 2 3 4

可以看到 :
varchar:   D5 D4 XX XX XX XX  六个字节表示了 三个汉字. 
nvarchar:  75 8D XX XX XX XX  应该也是六个字节表示了三个汉字. 

通过百度发现 赵的 GBK编码其实是 D5D4, 明显 varchar使用GBK进行了存储. 
另外发现     赵的 unicode编码是 8D75 也就是 nvarchar的字符存储方式. 

所以明显可以看到, varchar 使用了 我这个数据库 Chinese_prc_ci_as的默认字符存储方式
但是当时使用nvarchar时 使用的就是  unicode的编码存储格式. 

韩文部分

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

0011C100                                              61 62                 ab
0011C110   63 64 65 3F 3F 31 32 33  34 35 61 00 62 00 63 00   cde??12345a b c 
0011C120   64 00 65 00 3F 00 3F 00  31 00 32 00 33 00 34 00   d e ? ? 1 2 3 4 
0011C130   35 00 30 00 04 00 02 00  00 02 00 19 00 31 00 61   5 0          1 a
0011C140   62 63 64 65 3F 3F 31 32  33 34 35 61 00 62 00 63   bcde??12345a b c
0011C150   00 64 00 65 00 5C D5 6D  AD 31 00 32 00 33 00 34    d e \誱? 2 3 4
0011C160   00 35                                               5

因为我想写的是韩文 
只有N 开头的字段保存正常: 
한국 的UNICDE 码为: D55C  AD6D
可以看到数据库里面存储的也是: 5CD5 6DAD
比较符合预期.

也说明 nvarchar里面存的是 unicode 的字符 而不是utf-8的编码格式. 
SQLServer数据库这一块的设置还是比较有意思的. 

标签:00,varchar,31,SQLServer,XX,63,nvarchar
From: https://www.cnblogs.com/jinanxiaolaohu/p/17924735.html

相关文章

  • 凡是有但是-varchar和nvarchar的初步学习之一
    凡是有但是-varchar和nvarchar的初步学习之一背景高应用开发,在涉及到国内国外的问题时,重要的事情有两个:时区转换,字符集转换.时区转换虽然是很难理清楚,各种规范不统一的事情但是字符集转换更加扯淡.如果是一种数据库,一种字符集可能还好说现在面临的是多种数......
  • 将SQLServer单个表设置只读访问权限
    将SQLServer单个表设置只读访问权限 1.        Insert,Update,Delete触发器CREATETRIGGERtrReadOnlyONtablenameINSTEADOFINSERT,UPDATE,DELETEASBEGINRAISERROR('tableisreadonly.',16,1)ROLLBACKTRANSACTIONEND 2.     ......
  • SQLSERVER导入EXCEL数据
    1、整理好对应的EXCEL表格数据,要有标题行。否则无法映射。 2、登录进入SQLSERVER数据库管理软件,选中要导入的数据库,右键-->点击任务-->选择导入数据  3、点击下一步,直到这个页面,数据源下拉选择EXCEL,选择文件路径,勾选首行包含列名称3、(1)如果点击下一步报错The'Microsof......
  • PowerDesigner SqlServer 表列描述脚本无法执行问题
    1.原脚本,sp_addextendedproperty的0级别类型写的是user,这个类型在高版本中已经删除,无法使用,应该切换成SCHEMA [ifexists(select1fromsys.extended_propertiespwherep.major_id=object_id('[%QUALIFIER%]%TABLE%')andp.minor_id=(selectc.column_idfrom......
  • SQLserver AlwaysOn 提交模式与节点的可用性
    接上文:https://www.cnblogs.com/wy123/p/17905118.html,关于AlwaysOn主副本与辅助副本之间提交模式与安全故障转移的话题参考AlwaysOn属性面板中的信息1,主节点异步提交模式:如果主要副本配置为“异步提交模式” ,则从节点不管是同步或者异步,主节点提交事务都无须等待从节点(永远......
  • 2023最新高级难度MS SqlServer面试题,包含答案。刷题必备!记录一下。
    好记性不如烂笔头内容来自[面试宝典-高级难度MSSqlServer面试题合集](https://offer.houxu6.top/tag/MSSqlServer)问:请简述SqlServer中的分布式查询的功能和用法。分布式查询是Microsoft®SQLServer支持的一项功能,它可以将来自多个数据库服务器的数据整合在一起,以......
  • sqlserver 查询一个表的主键是哪些表的外键
    select object_name(a.parent_object_id)as '表名'from sys.foreign_keys awhere a.referenced_object_id=object_id('XXX')--XXX为需要查询的表......
  • SQLServer删除数据库特别耗时
    在老库删除数据库的时候,如果选中到了选项"DeletebackupandRestoreHistoryInformationfordatabases"。发现删除操作要耗费很久的时间,甚至好几天。查看一下正在执行的会话信息,看看数据库都在做啥:SELECTs.session_id,r.STATUS,r.blocking_session_id'Blkby'......
  • SQLServer 添加数据文件
    限制:1.backup语句正在运行时,不能添加或删除文件2.可以为每个数据库指定最多32767个文件和32767个文件组一、新增文件之前查看usetestselectfile_id,file_guid,type,type_desc,data_space_id,name,physical_name,state,state_descfromsys.database_filesSELECT......
  • Win11无法启动SqlServer服务问题,SqlServer服务启动1067错误
    因为SQLServer当前支持512字节和4KB的扇区存储大小。所以需要将SqlServer安装到支持4KB的磁盘。以管理员权限运行PowerShell,执行fsutilfsinfosectorinfoC:命令查看各磁盘是否支持4kb存储查找以下字段值(单位为字节)PhysicalBytesPerSectorForAtomicityPhysicalBytesPe......