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 ...
随机推荐
- 定制卡牌式 banner
HTML <template> <view > <swiper class='swiperClass' autoplay interval="2000" ...
- 自定义View的onDraw 函数不执行
解决办法: 在自定义的View 的构造方法中添加一句话: this.setWillNotDraw(false);解释:那么加这条语句的作用是什么?先看API: If this ...
- Java List转为Object组
代码: private Object[] ListToObject(List<String> list){ Object [] tem = new Object[]{}; int size ...
- uniapp最简单的上拉加载更多demo
data() { return { list:[],//数据列表 page: 1,//页数 } }, //请求一下数据(进入页面请求一次) onLoad() { this.getnewsList(th ...
- uView的DatetimePicker详解
uView UI号称: 是全面兼容nvue的uni-app生态框架,全面的组件和便捷的工具会让您信手拈来,如鱼得水 亲身感受,用起来真的坑太多, 官方文档太简洁, 很多配置都没说明也没代码, 上百度查 ...
- java基础-字符流
字符流 * 字符流是可以直接读写字符的IO流 * 字符流读取字符, 就要先读取到字节数据, 然后转为字符. 如果要写出字符, 需要把字符转为字节再写出. FileReader * FileRea ...
- vue过滤金额自动补全小数点
watch:{ //监听input双向绑定 balance(value) { //保留2位小数点过滤器 不四舍五入 var toFixedNum = Number(value).toFixed(3); ...
- 在 Mac 上开发 .NET MAUI
.NET 多平台应用程序 UI (.NET MAUI) 是一个跨平台框架,用于使用 C# 和 XAML 创建本机移动和桌面应用程序,这些应用程序可以从单个共享代码库在 Android.iOS.macO ...
- Arrays工具类与Collections工具类
Arrays工具类 : Arrays.sort():对指定数组进行排序,从小到大 Arrays.toString():返回数组的内容的字符串表示形式 Arrays.asList():数组转List,但 ...
- k8s节点执行master命令报错 localhost:8080 was refused
首先是按照二进制方式安装的k8s. [root@ht22 calico]# cat /etc/redhat-release CentOS Linux release 7.9.2009 (Core) [ ...