知识点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中的数字、字母和汉字的更多相关文章

  1. EXCEL表格单元格中包含数字英文和汉字,如何自动去掉汉字,保留英文和数字

    EXCEL表格单元格中包含数字英文和汉字,如何自动去掉汉字,保留英文和数字 Function 求数字和字母(对象 As String) '在文本与数字混杂中提取数字和字母   Dim myReg    ...

  2. 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 ...

  3. JavaScript 中怎样判断文本框只能输出英文字母、汉字和数字,不能输入特殊字符!

    JS-只能输入中文和英文2008-11-08 10:17在js中用正则表达式对象(RegExp)判断中文 ^[\u0391-\uFFE5]+$英文 ^[A-Za-z]+$中文和英文/^[\u0391- ...

  4. sql server 提取汉字/数字/字母的方法

    sql server 提取汉字/数字/字母的方法 --提取数字 IF OBJECT_ID('DBO.GET_NUMBER2') IS NOT NULL DROP FUNCTION DBO.GET_NU ...

  5. 【Teradata SQL】从中文数字字母混合字符串中只提取数字regexp_substr

    目标:从中文数字字母的字符串中只提取数字 sel regexp_substr('mint choc中文11国1','\d+')

  6. 字母数字、字母、汉字验证码 (java)

    原文:http://blog.csdn.net/qh_java/article/details/49854477 一.字母数字,字母,汉字验证码的生成代码 1.字母数字验证码: package com ...

  7. 在论坛中出现的比较难的sql问题:16(取一个字段中的数字)

    原文:在论坛中出现的比较难的sql问题:16(取一个字段中的数字) 所以,觉得有必要记录下来,这样以后再次碰到这类问题,也能从中获取解答的思路. 问题:取一个字段中的数字http://bbs.csdn ...

  8. Oracle中对数字加汉字的排序

    需求:有一列NAME, varchar2类型,内容如下 以上就是已经按order by name进行排序的,但不是我们想要的结果 现在需要只按数字进行排序 第一步:抽取数字由于数字有是一位的有是两位的 ...

  9. 转载: 黄聪:C#中 Excel列字母与数字的转换

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

随机推荐

  1. vux+vue-cli3.0坑

    最近开发了项目使用了vue-cli3.0+vux搭建的项目,现在总结遇到的问题: 环境:github vux有关于vue-cli3.0以及vux已经搭建好的脚手架vux-cli3链接 一:如下报错 解 ...

  2. 华为交换机Stelnet ssh/rsa验证模式下16进制公钥生成方法

    1.生成秘钥 需要在你自己电脑上生成 执行下面命令,默认生成位置是~/.ssh ssh-keygen -t rsa -b 1024 -f yourkeyname -C "备注" 参 ...

  3. 93. 复原 IP 地址

    做题思路or感想 这种字符串切割的问题都可以用回溯法来解决 递归三部曲: 递归参数 因为要切割字符串,所以要用一个startIndex来控制子串的开头位置,即是会切割出一个范围是[startIndex ...

  4. python并发——生产者消费者信号量实现

    介绍 写扫描器的时候,需要让资产扫描结果一出来(生产者),另外一边就会开个线程去运行漏洞扫描(消费者). 但是又不能让结果没出来,另外一边消费者就开始干活了. 代码 # *coding:UTF-8 * ...

  5. 使用 LOAD DATA LOCAL INFILE,sysbench 导数速度提升30%

    1. LOAD DATA INFILE 为什么比 INSERT 快? 2. sysbench 压测 MySQL 的四个标准步骤. 3. 怎么让 sysbench 支持 LOAD DATA LOCAL ...

  6. Java三大结构

    Java三大结构 顺序结构(基本结构) 选择结构 循环结构 1. 顺序结构 平时一般语句都默认遵循顺序结构 2. 选择结构 2.1 if单选择结构 语法 if(布尔表达式){ //布尔表达式为true ...

  7. openlayers API实现鹰眼图OverviewMap时地图不断闪烁等问题的解决思路

    前言:我吐了,OpenLayers的巨坑之一--鹰眼图OverviewMap创建之必备注意事项. 许久没有更新博客的我,在今天饱受折磨之后一定要分享一下(这么过分一定要说出来.jpg) 相信大家如果使 ...

  8. 从零开始学YC-Framework之初步

    本文主要内容为如下几个方面? YC-Framework的取名出于什么考虑? YC-Framework的特点有哪些? YC-Framework的模块由哪些组成? 为什么要开发YC-Framework? ...

  9. Go单体服务开发最佳实践

    单体最佳实践的由来 对于很多初创公司来说,业务的早期我们更应该关注于业务价值的交付,并且此时用户体量也很小,QPS 也非常低,我们应该使用更简单的技术架构来加速业务价值的交付,此时单体的优势就体现出来 ...

  10. XCTF练习题---MISC---pure-color

    XCTF练习题---MISC---pure-color flag:flag{true_steganographers_doesnt_need_any_tools} 解题步骤: 1.观察题目,下载附件 ...