【你也能从零基础学会网站开发】SQL Server 2000中的数据类型之String字符串类型

🚀 个人主页 极客小俊
✍🏻 作者简介:程序猿、设计师、技术分享
🐋 希望大家多多支持, 我们一起学习和进步!
🏅 欢迎评论 ❤️点赞💬评论 📂收藏 📂加关注

SQL Server 中字符串类型介绍

啊~~~~ 说到这个字符串类型,那么用处可就多了,我们经常会在实际开发中保存各种各样的字符串类型到数据库中!

并且在 SQL Server 2000 中,字符串类型主要分为两大类:固定长度字符串类型可变长度的字符串类型
主要是用来存储文本数据,比如: 名称、描述甚至是一整篇html代码结构都有可能存下来!

那么根据需求划分字符串类型主要被分为以下几种:

如下表

类型名称存储大小取值描述
char(n)n的范围是1到8000如果存储的字符串长度小于n,则尾部会用空格填充。是一种固定长度非Unicode字符数据
varchar(n)n的范围是1到8000存储长度为实际数据的长度用于存储长度信息,是一种可变长度非Unicode字符数据
nchar(n)n的范围是1到4000每个字符占两个字节是一种固定长度的Unicode字符数据
nvarchar(n)n的范围是1到4000每个字符占两个字节,存储长度为实际字符数的两倍加2个字节是一种可变长度的Unicode字符数据
text最大长度为231-1 =(2,147,483,647)个字符用于存储可变长度的非Unicode文本数据
ntext最大长度为230-1 =(1,073,741,823)个字符。用于存储可变长度的Unicode文本数据

那么我们依次来详细介绍一下这些类型和他们之间的区别

什么叫可变长度、什么叫固定长度 ?

在了解字符串类型之前,我们先要明白一个概念,就是在 字符串类型中的可变固定的意思!
我们可以利用上表中的charvarchar这两种类型来举例说明!

固定长度(Fixed)char类型

当我们说某个字段是固定长度的时候,意味着这个字段在数据库中占用的空间大小是预先确定且不会改变的。

比如char(n)类型, 无论我们实际存储的字符串有多长(前提条件:只要不超过n个字符范围), 那么数据库都会为这个字段分配n个字符的空间。

如果存储的字符串长度小于n,数据库可能会用空格或其他填充字符,来填充剩余空间,以确保总长度达到n。
当然这些填充的空格在检索数据时通常会被忽略或自动移除!

例如


比如这里我们设置了char长度为600,那么意思就是无论我们实际存储的字符串有多长,只要不超过这个600个字符的长度,那么数据库都会给这个字段分配600个字符的空间, 懂了吧! 🧐🧐🧐

用通俗易懂的话来讲,就像是你有一个固定大小的盒子,无论你要放进去的糖果数量是多少(只要不超过盒子的容量),你都需要整个盒子来装这些糖果, 对吧! 如果糖果太少,你可能会在盒子里放些填充物来填满空间, 这在数据库中就叫固定长度

当然我们的char设置范围在1 ~ 8000 超出这个设置范围是不行的哈!

如图


不会真有人设置一个8000长度,然后存储一个姓名吧! 🥵🥵

可变长度(Variable) varchar类型

相对固定长度而言可变长度意味着字段在数据库中占用的空间大小可以根据实际存储的数据量动态调整

举个栗子
varchar(n)为例,这里的n指定了字段可以存储的最大字符数,但实际占用的空间将仅包括存储字符串所需的字符加上一个额外的长度字节(在某些数据库系统中可能是两个字节)来记录字符串的实际长度的, 这意味着如果我们存储的字符串很短,那么字段占用的空间也会相应减少!

如图

这里我们设置了varchar长度为600 那么如果我们实际存的数据只有4个字符,那么就不会占600长度,它会自动调整为这4个字符的占用长度!

想象你有一个可以伸缩的袋子,你可以根据放入物品的多少来调整袋子的大, 如果你只放了几颗糖果,袋子就会保持很小, 如果你放了很多糖果,袋子就会变大来适应🤗🤗 怎么样这种可伸缩的字符串类型是不是很不错!

所以固定长度无论实际存储多少数据,都占用固定的空间大小,而可变长度根据实际存储的数据量来动态调整占用的空间大小,这久是它们彼此主要区别!

在我们平常的数据库设计中,选择固定长度还是可变长度的字段类型取决于具体的应用场景和性能要求,
固定长度也不是一无是处, 这种类型可以提供更好的性能, 因为数据库可以更容易地管理检索固定大小的数据块, 但可能会导致空间浪费, 比如为了确保数据完整性需要确保存储在字段中的每个值都具有相同的长度时,那么char(n) 就是一个好选择, 如果字段经常存储的字符串长度远小于指定的 n,那么使用 char(n) 可能会导致空间浪费!

可变长度的字段,例如varchar(n)则可以更灵活地利用存储空间,但可能在某些情况下会影响性能,具体我们在后面的项目项目里慢慢在细谈! 😘😘

SQL Server 2000中的非Unicode字符数据和编码问题

首先要清楚的是Unicode 是一个编码标准,旨在为世界上的每一种系统中的每一个字符提供一个唯一的数字标识符!

当然类似于char(n) 类型在没有特别指定为 Unicode 类型的情况下, 通常使用数据库系统数据库默认字符集来存储数据,这个字符集可能不支持或不完全支持 Unicode, 从而可能产生乱码的情况,乱码通常是由于字符编码和解码过程中使用了不匹配的字符集所导致的!

所以在在数据库设计中,尽可能使用支持Unicode的字段数据类型, 这些类型可以确保无论存储什么字符,都不会出现乱码问题,如nchar、nvarchar、ntext这些!

当然我们也可以在创建数据库的时候指定一个Unicode字符集作为默认字符集
这样,即使使用char(n)varchar(n)等类型,也可以在一定程度上确保存储的字符不会因字符集不支持而出现乱码的情况, 这些操作你都可以使用数据库管理系统提供的工具去实现,比如企业管理器、Navicat等…

如图

如果是使用SQL创建数据库,并且指定字符集,可以通过collate子句指定排序规, 如下:

CREATE DATABASE 数据吗名称 collate 字符集名

如图

SQL Server2000中如果我们不指定编码类型(排序规则),那么默认会是Chinese_PRC_CI_AS的字符集
这种字符集其实也是一种Unicode字符集的部分,Chinese_PRC_指针对大陆简体字Unicode的排序规则,存储中文还行!

SQL Server 2000查询字符集(排序规则)

SQL Server 2000中,设置和查看数据库及表的编码主要通过排序规则(Collation)来实现,因为SQL Server中的编码格式主要是通过排序规则来定义的, 所以在这里称呼上字符集编码排序规则你可以看成是一个东西!

这里要注意一下,因为SQL Server 2000的企业管理器界面较为陈旧,并不支持直接查看排序规则,我们可以使用SQL查询来获取, 比如这里我们使用DATABASEPROPERTYEX函数

SELECT DATABASEPROPERTYEX('你的数据库名称', 'Collation') AS DatabaseCollation

如图

关于修改数据库的排序规则

SQL Server 2000是不直接支持修改现有数据库的默认排序规则的,因为排序规则是数据库级别的属性,并且与数据的数据存储紧密相关, 如果确实需要更改排序规则,通常需要导出数据、删除数据库、以新的排序规则重新创建数据库,然后导入数据, 这样一波操作下来属实是一个复杂且可能耗时的过程

所以我们在设计数据库时应谨慎选择排序规则!

设置字段的编码

在表已经存在的情况下修改表结构时,我们也可以单独修改字段的排序规则

语法如下

ALTER TABLE 表名称 ALTER COLUMN 字段名 字符串数据类型 COLLATE 字符集名称

例如

ALTER TABLE test ALTER COLUMN username varchar(200) COLLATE Chinese_PRC_CI_AS;

当然也可以在创建表的时候,指定字段的字符集编码

CREATE TABLE 表名称(  字段名 字符串数据类型 COLLATE 字符集名称
)

如图

我们也可以通过企业管理器来可视化修改

如图

SQL Server 2000 常见的字符集如下:

简体中文(中国大陆)

Chinese_PRC_CI_AS:简体中文(中国大陆),不区分大小写,区分重音。
Chinese_PRC_Stroke_CI_AS:简体中文(中国大陆),按笔划排序,不区分大小写,区分重音。

英文

Latin1_General_CI_AS:西欧语言通用,不区分大小写,区分重音。
Latin1_General_BIN:西欧语言通用,二进制排序。

其他语言

Japanese_CI_AS:日语,不区分大小写,区分重音。
Korean_Wansung_CI_AS:韩语(万声),不区分大小写,区分重音。

随意修改编码有多可怕? 看看下面的案例就知道了!

如图


这些中文数据在username字段中为Chinese_PRC_CI_AS字符集编码,我们现在把它修改为Japanese_CI_AS字符集试试看

如图

我们在企业管理器再去查看一下,username字段的数据

如图


看到了吧,出现了乱码! 这就是乱码的原因, 所以字符串类型的字段,是最怕随意乱修改字符集编码的, 这会对实际开发造成很大的阻碍!

另外我们还可以在将数据发送到数据库之前,以及在从数据库检索数据之后,在应用程序处理字符编码
这包括确保在发送接收数据时使用了正确的字符编码,以及在需要时进行编码转换!
这里的应用程序,自然就是我们的php、python、java了, 指的就是在使用如php、python、java等编程语言时,对发送到数据库的数据和从数据库检索的数据进行字符编码的处理, 以便于编码的统一, 这我们在其他的语言开发中进行详细讲解,大家留意一下!

总之了解并正确处理字符编码是避免数据库中出现乱码问题的关键, 在选择字段类型、指定字符集以及在应用程序中处理数据时,都需要特别注意这一点, 这也是字符串类型 最容易出问题的地方!

就目前而言,平常存储中文英文的数据,UTF-8是最常用的编码方式, 这种编码方式不仅支持中英文,还支持世界上几乎所有的字符系统,具有广泛的兼容性和灵活性,UTF-8编码在存储英文字符时非常节省空间,每个英文字符只占用1个字节,在存储中文字符占用3个字节, 现在基本上在设计数据库、网站或应用程序时,都是使用UTF-8编码来存储中文英文字符串数据!

nchar和nvarchar类型

其实这两个类型和上面基本上一样,不同的就是他们都支持unicode编码类型, nchar和nvarchar长度范围都是1 到 4,000 个字符 , 其他特性跟charvarchar一样!

但是很多人肯定还会疑惑,到底我是选择前面带n的还是不带n的呢?

其实nchar 和 nvarchar 类型相对于 char 和 varchar 类型来说,会占用更多的存储空间! ! 🤐🤐

因为Unicode编码, 如 UTF-16,UFT-8这些通常比其他编码使用更多的字节来表示字符, 所以在存储大量短文本的时候使用char 和 varchar类型可能会更节省空间, 这都看需求和实际应用场景决定了!

text和ntext 文本类型

这两个类型的区别也是跟上面一样,前面带n和不带n就是是否支持unicode编码类型!

text 用于存储可变长度的非Unicode文本数据,最大长度为231-1相当于 = 2,147,483,647 个字符
ntext 用于存储可变长度的Unicode文本数据,最大长度为230-1 相当于= 1,073,741,823个字符

在我们的字段需要存储非常巨量的字符串内容的时候,我们就会选择它们!

选择字符串数据类型应用场景

当字段中存储的数据长度几乎总是相同时,那么我们采用 char或 nchar类型

例如
存储固定长度的国际化标识符或代码,确保在不同语言环境下的一致性和准确性,存储一些邮政编码,因为有些邮政编码总是5位数字,可以定义为char(5), 存储固定长度的代码或标识符,如国家代码、货币代码、股票代码

当字段中存储的数据长度变化较大时,使用 varchar或 nvarchar类型

例如
存储用户的名字或地址,这些信息的长度因用户而异, 存储长度不固定的代码或标识符, 但有一个合理的最大长度限制, 存储用户输入的文本信息,如评论、描述等,这些信息可能包含多种语言的字符,也可能随时被修改!

当需要存储大量文本字符串时,使用 text或 ntext类型最合适!

"👍点赞" "✍️评论" "收藏❤️"

大家的支持就是我坚持下去的动力!

如果以上内容有任何错误或者不准确的地方,🤗🤗🤗欢迎在下面 👇👇👇 留个言指出、或者你有更好的想法,
欢迎一起交流学习❤️❤️💛💛💚💚

更多 好玩 好用 好看的干货教程可以 点击下方关注❤️ 微信公众号❤️
说不定有意料之外的收获哦..🤗嘿嘿嘿、嘻嘻嘻🤗!
🌽🍓🍎🍍🍉🍇

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/392184.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

不用PS也能抠图?点哪抠哪,简直是职场人的最强助手

抠图你还在用 PS 一点点抠吗? 不仅费时费力,还常常达不到理想效果,真的太让人崩溃了 但别担心,我找到了一个超棒的工具——千鹿设计助手的AI智能抠图插件。它就像你的私人设计小助手,能快速帮你把想要的元素抠出来&…

《花100块做个摸鱼小网站! · 序》灵感来源

序 大家好呀,我是summo,这次来写写我在上班空闲(摸鱼)的时候做的一个小网站的事。去年阿里云不是推出了个活动嘛,2核2G的云服务器一年只要99块钱,懂行的人应该知道这个价格在业界已经是非常良心了,虽然优惠只有一年&a…

C++初阶学习——探索STL奥秘——模拟实现string类

1、string类的构造 上面的代码从表面看没什么问题,但是运行后会发现程序有多处bug 但是如上图一样,这样改进依然有bug 因为我们编写无参构造函数的时候,肯定要让_str默认为nullptr,但是这样的话,在main函数中创建对象…

电脑运行库问题怎么修复?电脑运行库修复工具分享与实操

在我们日常使用电脑的过程中,经常会遇到一些因为运行库缺失或损坏而导致软件无法正常运行的问题。这些问题不仅影响工作效率,还可能导致数据丢失或程序崩溃。那么,电脑运行库怎么修复呢?本文将为您详细介绍如何使用运行库修复工具…

STL-list

1.list 1. list是可以在常数范围内在任意位置进行插入和删除的序列式容器,并且该容器可以前后双向迭代。 2. list的底层是双向链表结构,双向链表中每个元素存储在互不相关的独立节点中,在节点中通过指针指向其前一个元素和后一个元素。 3. l…

黑马Java零基础视频教程精华部分_12_面向对象进阶(4)_内部类

《黑马Java零基础视频教程精华部分》系列文章目录 黑马Java零基础视频教程精华部分_1_JDK、JRE、字面量、JAVA运算符 黑马Java零基础视频教程精华部分_2_顺序结构、分支结构、循环结构 黑马Java零基础视频教程精华部分_3_无限循环、跳转控制语句、数组、方法 黑马Java零基础视…

IEEE Trans系列,超低自引率,沾边可收,截稿在即,版面有限!

关注GZH【欧亚科睿学术】,第一时间了解期刊最新动态! 👇 👇 👇 👇 这本IEEE Trans系列!指标优秀! IEEE-Trans系列期刊IEEE TRANSACTIONS ON INTELLIGENT VEHICLES (查看原文)…

详解直铺防静电瓷砖的特点与优势

防静电地板分为架空防静电地板和直铺防静电地板,直铺式防静电地板是一种直接铺设在地面上的地板系统,防静电瓷砖就是常用的直铺防静电地板之一。防静电瓷砖是在瓷砖烧制过程中加入防静电功能粉体进行物理改性,规格为600*600*10mm,…

前端常用的几个工具网站

觉得不错的前端工具类网站 1、Grid布局生成 https://cssgrid-generator.netlify.app 2、拟物按钮样式生成 https://neumorphism.io 3、玻璃形态效果 在线制作CSS玻璃形态 4、一些Button、checkBox、switch、card的css样式 零代码 - 精美CSS样式库 5、CSS阴影生成 在线创建…

学习c语言第二十天(自定义类型)

一、结构体 1.结构体声明 结构是一些值的集合,这些值称为成员变量。结构的每个成员可以是不同类型的变量。 1.1结构体的声明 struct stu {char name[20];int age; }s1,s2;//s1,s2是struct stu 类型的变量,//可以不创建,在main函数里创建 …

进程的管理与控制详解:创建、终止、阻塞等待与非阻塞等待

目录 一、进程创建 1、实例 2、fork函数详解 (1)fork函数模板 (2). fork() 函数的工作原理 (3). fork() 返回值和错误处理 3、如何理解进程创建过程 二、进程终止 1、终止是在做什么? 2、进程终止,有三种情况 3、进程如何终止? 三…

【独家原创RIME-CNN-LSSVM】基于霜冰优化算法优化卷积神经网络(CNN)结合最小二乘向量机(LSSVM)的数据回归预测

【独家原创RIME-CNN-LSSVM】基于霜冰优化算法优化卷积神经网络(CNN)结合最小二乘向量机(LSSVM)的数据回归预测 目录 【独家原创RIME-CNN-LSSVM】基于霜冰优化算法优化卷积神经网络(CNN)结合最小二乘向量机(LSSVM)的数据回归预测效果一览基本介绍程序设计参考资料 效果一览 基本…

c->c++(四):gtest

本文主要探讨gtest相关内容。 gtest安装 wget -O gtest.zip https://github.com/google/googletest/archive/refs/heads/main.zipunzip gtest.zipcd googletest-mainmkdir bulid && cd buildcmake .. && make && make install gtest API TEST/TEST…

Redis02——缓存(缓存更新策略、缓存穿透、缓存雪崩、缓存击穿、缓存工具封装)

目录 缓存概念 添加Redis缓存 业务场景 缓存作用模型 java代码 缓存更新策略 主动更新的三种策略 主动更新——Cache Aside Pattern 实际应用 缓存穿透 概念 解决方法 实际应用 缓存雪崩 概念 解决方法 缓存击穿 互斥锁 介绍 实际应用 逻辑过期 介绍 实际…

基于Yolov8面部七种表情检测与识别C++模型部署

表情识别 七种表情识别是一个多学科交叉的研究领域,它结合了心理学、认知科学、计算机视觉和机器学习等学科的知识和技术。 基本概念 表情的定义:表情是人们在情绪体验时面部肌肉活动的结果,是人类情感交流的基本方式之一。基本表情理论&a…

使用Step Functions运行AWS Backup时必备的权限要点

引言 在尝试从Step Functions执行AWS Backup的按需备份时,我在权限方面遇到了一些困难。为了备忘,我将这些经验写成这篇文章。 概述 从Step Functions执行AWS Backup时,需要分配以下权限: AWS Backup相关权限 执行备份的权限…

Java: 线程安全问题的解决方案(synchronized)

发生原因 要想解决线程安全问题,那么我们首先得知道线程安全问题为什么会发生. 发生原因: 线程在操作系统中是"随机调度,抢占式执行的"[根本原因].多个线程,同时修改同一个变量修改操作不是"原子"的内存可见性问题指令重排序 解决方案 原因1和2,我们很…

04:【stm32】LED编程和按键控制

LED编程和按键控制 1、LED编程1.1、点亮一课LED灯 2、按键控制2.1、通过一个按钮控制LED灯的亮灭 1、LED编程 1.1、点亮一课LED灯 首先,我们想象一下,让LED灯点亮,引脚应该是输出模式,那么应该是通用模式,还是复用模式…

打靶记录7——Hacker_Kid-v1.0.1

靶机下载地址 https://download.vulnhub.com/hackerkid/Hacker_Kid-v1.0.1.ova难度 OSCP 风格的中级难度靶机(只需要获取root权限即可,CTF 风格的靶机就还需要获取flag) 涉及的攻击方法: 主机发现端口扫描Web信息收集DNS区域传…

Redis2-Redis常见命令

目录 Redis数据结构介绍 Redis通用命令 KEYS DEL EXISTS EXPIRE String类型 Key的层级格式 Hash类型 List类型 Set类型 SortedSet类型 Redis数据结构介绍 Redis是一个key-value的数据库,key一般是String数据库,value的类型多种多样 可以通过…