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 ...
随机推荐
- SQLite实现数据库的储存2+SQLite数据库可视化工具SQLite Stadio
今日所学 SQLite实现数据库的储存 查看数据库的两种方法 Android 中 SQLite 数据库的查看 - woider - 博客园 SQLite Studio安装教程 [SQLite]可视化工 ...
- Mybatis + js 实现下拉列表二级联动
Mybatis + js 实现下拉列表二级联动 学习内容: 一.业务需求 二.实现效果 三.代码实现 1. province_city.jsp 2. TwoController 2. Province ...
- 判断H5页面是在小程序的webview环境中,还是在微信环境中,还是不在微信
<script src="https://res2.wx.qq.com/open/js/jweixin-1.6.0.js" type="text/javascrip ...
- Go语言 映射(map)
Go语言 映射(map) 1. 什么是 map2. 创建 map3. 访问 map4. nil map和空map5. map中元素的返回值6. len()和delete()7. 测试map中元素是否 ...
- JavaSE常用类之Object类
1. hashCode方法 代码: package NeiBuLei; public class hashCode { public static void main(String[] args) { ...
- ethool的使用
ethtool命令 网络配置 ethtool命令用于获取以太网卡的配置信息,或者修改这些配置.这个命令比较复杂,功能特别多 语法 ethtool [ -a | -c | -g | -i | -d | ...
- vwware workstation虚机网络配置NAT
1.在编辑中选择虚拟网络编辑器,新增NAT模式网络适配器,如下图: 2.在虚拟机中选择设置,在网络适配器中自定义为上一步配置的网络适配器,如下图: 3.进入虚拟机后,编辑/etc/sysconfig/ ...
- LAN交换机自学习算法
LAN交换机自学习算法 提示 第二层交完全忽略帧的数据部分协议,仅根据第二层以太网的MAC地址做出转发决策. MAC地址表有时又被称作内容可编址内存(CAM)表 检查源MAC地址 如果源MAC地址不存 ...
- 一键智能Mock,你值得拥有
大家好呀,我是一名苦逼的前端开发工程师,为啥苦逼呢,这不,项目下周就要上线了,但是后端还没给我接口,没有接口我就无法调试,工作停滞不前,我也只能坐着干着急. 我报告给了我的老板山哥: 老板,这后端 ...
- Docker中级篇,看这篇就对了
点击上方"开源Linux",选择"设为星标"回复"学习"获取独家整理的学习资料! 姊妹篇: Docker容器网络-基础篇 十分钟看懂Dock ...