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数据库这一块的设置还是比较有意思的.

SQLServer的varchar与nvarchar的学习之二的更多相关文章

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

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

  2. sqlserver varchar和Nvarchar区别

    sql server中的varchar和Nvarchar有什么区别?   答:varchar(n)长度为 n 个字节的可变长度且非 Unicode 的字符数据.n 必须是一个介于 1 和 8,000 ...

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

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

  4. sql server varchar和nvarchar的区别

    一.前言 在了解varchar 和nvarchar之前咱们先了解一下这些词的字面和常用意思,以方便我们更好的使用: SQL SERVER中生成的语句中,字符串前加N.N 前缀必须是大写字母.是Unic ...

  5. SQL中varchar和nvarchar的基本介绍及其区别

    SQL中varchar和nvarchar的基本介绍及其区别 varchar(n) 长度为 n 个字节的可变长度且非 Unicode 的字符数据.n 必须是一个介于 1 和 8,000 之间的数值.存储 ...

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

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

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

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

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

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

  9. varchar和Nvarchar区别

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

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

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

随机推荐

  1. OfficeWeb365任意文件读取

    OfficeWeb365任意文件读取 OfficeWeb365 /Pic/Indexs接口处存在任意文件读取漏洞,攻击者可通过独特的加密方式对payload进行加密,读取任意文件,获取服务器敏感信息, ...

  2. Spring Boot中设置定时发送邮件任务

    1:浅谈发送邮箱: 邮箱验证是一个很常见的功能了,基本上每个网站都会用的到, java也有专门的jar来处理邮件发送等服务 2:学过javaweb大家都对发送邮箱上不是很陌生了吧 但之前发送邮箱的步骤 ...

  3. [Python急救站]百钱买百鸡

    百钱买百鸡:一人用100元买了100只鸡,其中公鸡5元一只,母鸡3元一只,小鸡1元一只.问:公鸡.母鸡.小鸡各多少只? 程序采用穷举法. for x in range(1, 21): for y in ...

  4. 2023-09-13:用go语言,给定一个整数数组 nums 和一个正整数 k, 找出是否有可能把这个数组分成 k 个非空子集,其总和都相等。 输入: nums = [4, 3, 2, 3, 5,

    2023-09-13:用go语言,给定一个整数数组 nums 和一个正整数 k, 找出是否有可能把这个数组分成 k 个非空子集,其总和都相等. 输入: nums = [4, 3, 2, 3, 5, 2 ...

  5. 3种依赖管理工具实现requirements.txt文件生成

    1.pip 实现方式   要使用 pip 生成 requirements.txt 文件,可以使用以下命令: pip freeze > requirements.txt   这个命令会将当前环境中 ...

  6. ipa文件怎么安装到iPhone手机上?

    ​ ipa文件怎么安装到iPhone手机上? 无需越狱帮你把ipa文件安装到苹果手机上 E86苹果签名简介:点击可查看 很多人都知道apk文件是安卓的app应用程序文件名,但有人知道苹果ios的app ...

  7. 大银行数字化升级之后,火山引擎 VeDI 这次要把能力带给中小金融机构

    更多技术交流.求职机会,欢迎关注字节跳动数据平台微信公众号,并进入官方交流群 数据技术是金融行业数字化转型的重要动力. 近年来,各大银行在全面推进数据技术建设上动作频频.比如,建设银行深化平台经营,依 ...

  8. selenium-web自动化(po模型)

    什么是po模型呢?简单理解就是:把每个页面当成一个对象,给这些页面当成一个类,主要就是完成元素定位和业务操作:把它和测试脚本区分开来,需要什么取这些页面类去调用即可.这样的好处在于页面元素发生变化时, ...

  9. Python上下文管理器的高级使用

    在文件处理和网络编程时,对于打开的文件不管最后内容处理是否符合预期都要在结束时关闭文件.这时常见的处理方法是try catch finally 的方法 f = open("demo.txt& ...

  10. Mongodb--索引(转载)

    原文转载自:https://www.cnblogs.com/wyy1234/p/11032163.html 1 mongoDB索引的管理 本节介绍mongoDB中的索引,熟悉mysql/sqlserv ...