SQL中的数字、字母和汉字
知识点001
当变量的数据类型为VARCHAR时,变量赋值后,变量中的字符所占字节数,数字和字母是1个bytes,汉字是2个bytes;
当变量的数据类型为NVARCHAR时,变量赋值后,变量中的字符所占字节数,数字、字母和汉字,均为2个bytes。
原因:NVARCHAR采用的字符集是unicode,unicode字符集中,无论是数字、字母、汉字,每个字符用2个bytes表示;
VARCHAR采用的字符集为非unicode,数字和字母用1个byte表示,汉字用2个bytes表示。
学会了这点,就可以很好的去解答这个问题:SQL字符串长度计算。
知识点002
假定变量的数据类型是VARCHAR(N) ,含义是它能存储的变量空间长度是N个bytes(注意,不是bit)
Sample:
DECLARE @name VARCHAR(10),
指变量@name的空间长度是10个字节。
我们知道,一个汉字占2个bytes,假如我们设计一个驾校管理系统,设计数据库的时候,将数据表字段name的数据类型设为VARCHAR(10)
10个字节,最多只能保存5个汉字,如果系统需要保存的人名长度大于5个汉字(比如俄罗斯总统普京,全名【弗拉基米尔·弗拉基米罗维奇·普京】,14个汉字,2个·字符),数据库就会截取变量值,只保存10个字节的内容,即【弗拉基米尔】,导致信息缺失。但是如果将name的数据类型声明为VARHCAR(32),问题就解决了。
PS:【弗拉基米尔·弗拉基米罗维奇·普京】汉字中间这个·(点号)
如果用搜狗输入法的符号大全中的“标点符号”栏下的点号·,则占2个字节存储空间,上文普京全名中的点号,即为这个。
如果用搜狗输入法的符号大全中的“特殊符号”栏下的点号,则占1个字节存储空间。
SQL验证:
DECLARE @name1 VARCHAR(10)
DECLARE @name2 VARCHAR(32) SET @name1 = '弗拉基米尔·弗拉基米罗维奇·普京'
SET @name2 = '弗拉基米尔·弗拉基米罗维奇·普京' SELECT @name1 AS name1,@name2 AS name2
执行结果:

值得注意的是,下面这个数据类型的空间长度问题。
假定变量的数据类型为NVARCHAR(N),含义是它能存储的变量空间长度是(2*N)个bytes.
综上,统一概念描述为:
1.SQL中,当声明一个变量的数据类型是VARCHAR(N)时,含义是:该变量可以存储空间长度为N个字节(bytes)的数据;
2.SQL中,当声明一个变量的数据类型是NVARCHAR(N)时,含义是:该变量可以容纳字符长度为N个字符(characters)的数据。
SQL代码验证。PS:SQL server 版本:Microsoft SQL Server 2008 (RTM) - 10.0.1600.22 (X64)
SQL版本查询语句:select @@VERSIONS
1 --汉字
2 CREATE TABLE dbo.Test1 (c1 NVARCHAR(4));
3 INSERT dbo.Test1 VALUES ('美人她爹');
4 SELECT DATALENGTH(c1) AS Bytes_of_Column_C1 FROM dbo.Test1;
5
6 CREATE TABLE dbo.Test2 (c2 VARCHAR(8));
7 INSERT dbo.Test2 VALUES ('美人她爹');
8 SELECT DATALENGTH(c2) AS Bytes_of_Column_C2 FROM dbo.Test2;
执行结果:

1 --数字
2 CREATE TABLE dbo.Test3 (c3 NVARCHAR(4));
3 INSERT dbo.Test3 VALUES ('1234');
4 SELECT DATALENGTH(c3) AS Bytes_of_Column_C3 FROM dbo.Test3;
5
6 CREATE TABLE dbo.Test4 (c4 VARCHAR(8));
7 INSERT dbo.Test4 VALUES ('12345678');
8 SELECT DATALENGTH(c4) AS Bytes_of_Column_C4 FROM dbo.Test4;
执行结果:

1 --字母
2 CREATE TABLE dbo.Test5 (c5 NVARCHAR(4));
3 INSERT dbo.Test5 VALUES ('abcd');
4 SELECT DATALENGTH(c5) AS Bytes_of_Column_C5 FROM dbo.Test5;
5
6 CREATE TABLE dbo.Test6 (c6 VARCHAR(8));
7 INSERT dbo.Test6 VALUES ('abcdefgh');
8 SELECT DATALENGTH(c6) AS Bytes_of_Column_C6 FROM dbo.Test6;
执行结果:

知识点003
上文提到两个笔者自定义的概念,空间长度和字符长度。借用这两个概念,说一下SQL中两个函数 LEN()和DATALENGTH()的区别。
区别1
LEN()函数返回值是字符串的字符数目(the number of characters of the specified string expression),即字符串的字符长度。
DATALENGTH()函数的返回值是字符串的字符所占空间,即字符串的空间长度。
区别2
LEN()函数计算字符串的字符长度时,不计算(包含)字符串末尾空格(trailing spaces);
DATALENGTH()函数计算字符串的空间长度时,计算(包含)字符串末尾空格。
上述两点区别,SQL验证如下:
1 DECLARE @sql_string_VARCHAR VARCHAR(100)
2 DECLARE @sql_string_NVARCHAR NVARCHAR(100)
3
4 SET @sql_string_VARCHAR = 'ab c '
5 SET @sql_string_NVARCHAR = 'ab c '
6
7 SELECT LEN(@sql_string_VARCHAR) AS characters_of_sql_string_varchar,
8 LEN(@sql_string_NVARCHAR) AS characters_of_sql_string_nvarchar
9 SELECT DATALENGTH(@sql_string_VARCHAR) AS Bytes_of_sql_string_varchar,
10 DATALENGTH(@sql_string_NVARCHAR) AS Bytes_of_sql_string_nvarchar
执行结果:

SQL中的数字、字母和汉字的更多相关文章
- EXCEL表格单元格中包含数字英文和汉字,如何自动去掉汉字,保留英文和数字
EXCEL表格单元格中包含数字英文和汉字,如何自动去掉汉字,保留英文和数字 Function 求数字和字母(对象 As String) '在文本与数字混杂中提取数字和字母 Dim myReg ...
- Working with Numbers in PL/SQL(在PL/SQL中使用数字)
This article gives you all the information you need in order to begin working with numbers in your P ...
- JavaScript 中怎样判断文本框只能输出英文字母、汉字和数字,不能输入特殊字符!
JS-只能输入中文和英文2008-11-08 10:17在js中用正则表达式对象(RegExp)判断中文 ^[\u0391-\uFFE5]+$英文 ^[A-Za-z]+$中文和英文/^[\u0391- ...
- sql server 提取汉字/数字/字母的方法
sql server 提取汉字/数字/字母的方法 --提取数字 IF OBJECT_ID('DBO.GET_NUMBER2') IS NOT NULL DROP FUNCTION DBO.GET_NU ...
- 【Teradata SQL】从中文数字字母混合字符串中只提取数字regexp_substr
目标:从中文数字字母的字符串中只提取数字 sel regexp_substr('mint choc中文11国1','\d+')
- 字母数字、字母、汉字验证码 (java)
原文:http://blog.csdn.net/qh_java/article/details/49854477 一.字母数字,字母,汉字验证码的生成代码 1.字母数字验证码: package com ...
- 在论坛中出现的比较难的sql问题:16(取一个字段中的数字)
原文:在论坛中出现的比较难的sql问题:16(取一个字段中的数字) 所以,觉得有必要记录下来,这样以后再次碰到这类问题,也能从中获取解答的思路. 问题:取一个字段中的数字http://bbs.csdn ...
- Oracle中对数字加汉字的排序
需求:有一列NAME, varchar2类型,内容如下 以上就是已经按order by name进行排序的,但不是我们想要的结果 现在需要只按数字进行排序 第一步:抽取数字由于数字有是一位的有是两位的 ...
- 转载: 黄聪:C#中 Excel列字母与数字的转换
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...
随机推荐
- layui文件上传组件“请求上传接口出现异常”问题解决方案
这是一个悲伤的故事,以前开发项目用过很多次这个组件,这次使用了Token,于是报了一些莫名其妙的错误,来复盘一下,警示自己! 刚开始接触layui的同学们肯定经常会看到这个错误 下面我们对这个异常的处 ...
- uni-app中遇到的跳转问题
最近在使用uni-app时,遇到的一个问题,使用uni.navigateTo跳转时在H5端是可以的,在小程序端报 fail webview count limit exceed 这个错,解决办法如下: ...
- Spring5-IOC底层原理
1.什么是IOC (1)控制反转,把对象创建和对象之间的调用过程,交给Spring进行管理 (2)使用IOC目的:为了降低耦合度 2.IOC底层原理 (1)xml解析.工厂模式.反射
- Zalando Postgres Operator 快速上手
本指南旨在让您快速了解在本地 Kubernetes 环境中使用 Postgres Operator. 前提条件 由于 Postgres Operator 是为 Kubernetes (K8s) 框架设 ...
- Linux下安装Typora
系统:Ubuntu16.0 下载链接:https://www.typora.io/#linux 参考链接:https://www.cnblogs.com/wenkangzero/p/13202415. ...
- Azure Virtual Desktop(一)创建配置管理
一,引言 Azure 虚拟创面是一项 Azure 服务,可以让我们管理: 1)VDI(虚拟桌面基础架构) 2)云端的 RDSH:RDSH 是 RDS(远程桌面服务)中的一个角色.这些类型的服务器用于托 ...
- .NET Core(.NET6)中gRPC使用
一.简介 简单解析一下gRPC,gRPC 是一个由Google开源的,跨语言的,高性能的远程过程调用(RPC)框架. 特点: 跨语言 内容protobuf格式(比json体积小),网络传输快 使用HT ...
- GO语言学习——基本数据类型字符串
字符串 Go语言中的字符串以原生数据类型出现. Go 语言里的字符串的内部实现使用UTF-8编码. 字符串的值为双引号(")中的内容,可以在Go语言的源码中直接添加非ASCII码字符 GO语 ...
- 【HCIE】ipv6之6to4隧道如何计算48位前缀地址
6to4隧道支持router-router,host-router,router-host,host-host 采用专用6to4地址,前缀为2002::/16 其中如何结合ipv4地址? 2002:i ...
- jmeter脚本编写
jmeter脚本编写 一.http协议接口编写注意事项 1.请求体为json格式:一定要写请求头Content-Type:application/json 2.json格式文本 2.1 key-val ...