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 ...
随机推荐
- 项目中常用到的布局 flex
1. 没header,footer固定 html<div class="page"> <div class="top"> <div ...
- Dockerfile入门
1.Dockerfile介绍 在之前Docker的使用中,我们直接从仓库下载需要的镜像到本地,然后稍加配置就可以应用了,通常从仓库下载下来的镜像都是通用的,无任何私有化的东西,我们拿过来就需要加很多的 ...
- python---选择排序的实现
选择排序 思想 一趟遍历记录最小的数, 放到第一个位置 再一趟遍历记录剩余列表中最小的数, 继续放置 关键点: 无序区: 第i趟, 无序区为 i~n-1 最小数的位置 import r ...
- Ubuntu更换apt镜像源
1. 手动更改 备份镜像源 cd /etc/apt cp sources.list sources.list.bak 修改镜像源 sudo vim sources.list # 复制粘贴下面镜像源,保 ...
- Spring集成web环境(手动实现)
1.创建UserDao接口及其实现类UserDaoImpl(接口代码省略) public class UserDaoImpl implements UserDao { @Override public ...
- SpringMVC快速使用——基于注解
SpringMVC快速使用--基于注解 1.引入依赖 <!-- 定义Spring版本 --> <properties> <spring.verson>5.3.8&l ...
- mysql HikariCP连接池配置
#连接池配置 #最小空闲连接,默认值10,小于0或大于maximum-pool-size,都会重置为maximum-pool-size spring.datasource.hikari.minimum ...
- Fabric2.2中的Raft共识模块源码分析
引言 Hyperledger Fabric是当前比较流行的一种联盟链系统,它隶属于Linux基金会在2015年创建的超级账本项目且是这个项目最重要的一个子项目.目前,与Hyperledger的另外几个 ...
- el-menu菜单 -- unique-opened 子菜单唯一性失效
总结: 点击的是 el-sub-menu . 所以 el-sub-menu 的唯一性是必须的.否则 unique-opened 属性不生效
- css 实现图片专场
<template> <div> </div> </template> <style lang="scss"> html ...