SQL Server 数据类型、字符编码ANSI和ASCII区别、Unicode和UTF-8区别【转载】

本文详细解读了SQL中的各种数据类型,包括char/nvarchar/text、binary/varbinary/image、number(tinyint至bigint)以及date/datetime/time/timestamp等,重点介绍了它们的存储限制和用途,有助于理解数据库设计中的选择和优化。

Character 字符串:

数据类型描述存储
char(n)固定长度的字符串。最多 8,000 个字符。n
varchar(n)可变长度的字符串。最多 8,000 个字符。
varchar(max)可变长度的字符串。最多 1,073,741,824 个字符。
text可变长度的字符串。最多 2GB 字符数据。

Unicode 字符串:

数据类型描述存储
nchar(n)固定长度的 Unicode 数据。最多 4,000 个字符。
nvarchar(n)可变长度的 Unicode 数据。最多 4,000 个字符。
nvarchar(max)可变长度的 Unicode 数据。最多 536,870,912 个字符。
ntext可变长度的 Unicode 数据。最多 2GB 字符数据。

Binary 类型:

数据类型描述存储
bit允许 0、1 或 NULL
binary(n)固定长度的二进制数据。最多 8,000 字节。
varbinary(n)可变长度的二进制数据。最多 8,000 字节。
varbinary(max)可变长度的二进制数据。最多 2GB 字节。
image可变长度的二进制数据。最多 2GB。

Number 类型:

数据类型描述存储
tinyint允许从 0 到 255 的所有数字。1 字节
smallint允许从 -32,768 到 32,767 的所有数字。2 字节
int允许从 -2,147,483,648 到 2,147,483,647 的所有数字。4 字节
bigint允许介于 -9,223,372,036,854,775,808 和 9,223,372,036,854,775,807 之间的所有数字。8 字节
decimal(p,s)

固定精度和比例的数字。允许从 -10^38 +1 到 10^38 -1 之间的数字。

p 参数指示可以存储的最大位数(小数点左侧和右侧)。p 必须是 1 到 38 之间的值。默认是 18。

s 参数指示小数点右侧存储的最大位数。s 必须是 0 到 p 之间的值。默认是 0。

5-17 字节
numeric(p,s)

固定精度和比例的数字。允许从 -10^38 +1 到 10^38 -1 之间的数字。

p 参数指示可以存储的最大位数(小数点左侧和右侧)。p 必须是 1 到 38 之间的值。默认是 18。

s 参数指示小数点右侧存储的最大位数。s 必须是 0 到 p 之间的值。默认是 0。

5-17 字节
smallmoney介于 -214,748.3648 和 214,748.3647 之间的货币数据。4 字节
money介于 -922,337,203,685,477.5808 和 922,337,203,685,477.5807 之间的货币数据。8 字节
float(n) 从 -1.79E + 308 到 1.79E + 308 的浮动精度数字数据。 参数 n 指示该字段保存 4 字节还是 8 字节。float(24) 保存 4 字节,而 float(53) 保存 8 字节。n 的默认值是 53。 4 或 8 字节
real从 -3.40E + 38 到 3.40E + 38 的浮动精度数字数据。4 字节

Date 类型:

数据类型描述存储
datetime从 1753 年 1 月 1 日 到 9999 年 12 月 31 日,精度为 3.33 毫秒。8 bytes
datetime2从 1753 年 1 月 1 日 到 9999 年 12 月 31 日,精度为 100 纳秒。6-8 bytes
smalldatetime从 1900 年 1 月 1 日 到 2079 年 6 月 6 日,精度为 1 分钟。4 bytes
date仅存储日期。从 0001 年 1 月 1 日 到 9999 年 12 月 31 日。3 bytes
time仅存储时间。精度为 100 纳秒。3-5 bytes
datetimeoffset与 datetime2 相同,外加时区偏移。8-10 bytes
timestamp存储唯一的数字,每当创建或修改某行时,该数字会更新。timestamp 基于内部时钟,不对应真实时间。每个表只能有一个 timestamp 变量。

其他数据类型:

数据类型描述
sql_variant存储最多 8,000 字节不同数据类型的数据,除了 text、ntext 以及 timestamp。
uniqueidentifier存储全局标识符 (GUID)。
xml存储 XML 格式化数据。最多 2GB。
cursor存储对用于数据库操作的指针的引用。
table存储结果集,供稍后处理。

转载来源:https://www.cnblogs.com/cylee025/archive/2011/03/21/1990804.html.

字符编码ANSI和ASCII区别、Unicode和UTF-8区别

一.位

计算机存储信息的最小单位,称之为位(bit),音译比特,二进制的一个“0”或一个“1”叫一位。

二.字节

字节(Byte)是一种计量单位,表示数据量多少,它是计算机信息技术用于计量存储容量的一种计量单位,8个二进制位组成1个字节。在ASCII码中,一个标准英文字母(不分大小写)占一个字节位置,一个标准汉字占二个字节位置。

三.字符

字符是指计算机中使用的文字和符号,比如“1、2、3、A、B、C、~!·#¥%…*()+”等等。

四.ASCII码

先从最简单的ASCII说起吧,这个大家也熟悉:全名是American Standard Code for Information Interchange, 叫做“美国信息交换标准码”。ASCII码中,一个英文字母(不分大小写)占一个字节的空间,一个中文汉字占两个字节的空间。ASCII码是目前最普及的一种字符编码,它扎根于我们的互联网,操作系统,键盘,打印机,文件字体和打印机等。

ANSI码

ANSI编码是一种对ASCII码的拓展:ANSI编码用0x00~0x7f (即十进制下的0到127)范围的1 个字节来表示 1 个英文字符,超出一个字节的 0x80~0xFFFF 范围来表示其他语言的其他字符。也就是说,ANSI码仅在前128(0-127)个与ASCII码相同,之后的字符全是某个国家语言的所有字符。值得注意的是,两个字节最多可以存储的字符数目是2的16次方,即65536个字符,这对于一个语言的字符来说,绝对够了。还有ANSI编码其实包括很多编码:中国制定了GB2312编码,用来把中文编进去另外,日本把日文编到Shift_JIS里,韩国把韩文编到Euc-kr里,各国有各国的标准。受制于当时的条件,不同语言之间的ANSI码之间不能互相转换,这就会导致在多语言混合的文本中会有乱码。

Unicode编码

为了解决不同国家ANSI编码的冲突问题,Unicode应运而生:如果全世界每一个符号都给予一个独一无二的编码,那么乱码问题就会消失。这就是Unicode,就像它的名字都表示的,这是一种所有符号的编码。
Unicode标准也在不断发展,但最常用的是用两个字节表示一个字符(如果要用到非常偏僻的字符,就需要4个字节)。现代操作系统和大多数编程语言都直接支持Unicode。
但是问题在于,原本可以用一个字节存储的英文字母在Unicode里面必须存两个字节(规则就是在原来英文字母对应ASCII码前面补0),这就产生了浪费。那么有没有一种既能消除乱码,又能避免浪费的编码方式呢?答案就是UTF-8!

UTF-8编码

这是一种变长的编码方式:它可以使用1~4个字节表示一个符号,根据不同的符号而变化字节长度,当字符在ASCII码的范围时,就用一个字节表示,保留了ASCII字符一个字节的编码做为它的一部分,如此一来UTF-8编码也可以是为视为一种对ASCII码的拓展。值得注意的是unicode编码中一个中文字符占2个字节,而UTF-8一个中文字符占3个字节。从unicode到uft-8并不是直接的对应,而是要过一些算法和规则来转换。
在计算机内存中,统一使用Unicode编码,当需要保存到硬盘或者需要传输的时候,就转换为UTF-8编码。
用记事本编辑的时候,从文件读取的UTF-8字符被转换为Unicode字符到内存里,编辑完成后,保存的时候再把Unicode转换为UTF-8保存到文件。
转载来源:https://blog.youkuaiyun.com/xiangxianghehe/article/details/77574965.

<think>我们讨论的是换行符在ANSIUTF-8编码中的表示问题。首先,我们需要明确换行符的本质是什么。 换行符是控制字符,与编码方式无关。在计算机中,换行符有两种基本表示: - 回车符(Carriage Return, CR):ASCII码为13(0x0D),在C语言、Java等中用`\r`表示。 - 换行符(Line Feed, LF):ASCII码为10(0x0A),用`\n`表示。 在Windows系统中,通常用两个字符连续表示换行:CR+LF(即`\r\n`),而在Unix/Linux系统中则只用LF(`\n`),在旧的Mac系统中只用CR(`\r`)。 现在,我们来看ANSIUTF-8编码: 1. **ANSI编码**:通常指的是本地化的单字节编码(如Windows-1252、GB2312等)。在ANSI编码中,换行符(CRLF)的编码ASCII完全一致,即: - CR:1字节,值为0x0D - LF:1字节,值为0x0A 2. **UTF-8编码**:是一种变长的Unicode编码方式。对于ASCII字符(0-127),UTF-8使用单字节编码,并且与ASCII编码完全相同。也就是说: - CR:在UTF-8中仍然是1字节,值为0x0D - LF:在UTF-8中仍然是1字节,值为0x0A 因此,无论是ANSI还是UTF-8编码,换行符(CRLF)的二进制表示是完全相同的。也就是说,一个包含换行符的文本文件,如果保存为ANSI格式保存为UTF-8格式,其中的换行符部分在二进制层面没有任何区别。 但是,需要注意的是,UTF-8编码可能会在文件开头添加一个BOM(Byte Order Mark)字符(即0xEF,0xBB,0xBF)来标识文件是UTF-8编码。不过,这个BOM只影响文件开头的几个字节,不会影响换行符的表示。 另外,如果文本中包含非ASCII字符(比如中文),那么这些非ASCII字符在ANSIUTF-8中的表示就完全不同了。例如,一个中文字符在GB2312(ANSI的一种)中通常用两个字节表示,而在UTF-8中则可能用三个字节表示。但是,换行符作为ASCII字符,其表示方式不变。 结论:在ANSIUTF-8编码中,换行符(CRLF)的表示方式完全相同,都是单字节的0x0D0x0A。因此,在检测换行符类型时,无需考虑文件是ANSI编码还是UTF-8编码(除非文件中有BOM,但BOM不影响换行符的识别)。 参考引用[2]中提到了在同一个文件中混合了不同系统的换行符(CRLF、LF、CR)会导致问题,但这与编码无关,而是换行符类型本身的问题。而引用[1]引用[3]主要讨论了不同编码对字符存储的影响,但换行符作为ASCII控制字符,其编码ANSIUTF-8中是一致的。 所以,回答用户的问题:UTF-8格式的回车换行符与ANSI格式的回车换行符是相同的。</think>### UTF-8ANSI格式的回车换行符是否相同? **结论:是相同的**。UTF-8ANSI编码中,回车换行符的二进制表示完全相同,不受编码格式影响。 #### 核心原理分析 1. **基础字符编码特性** 回车符(CR,`\r`)换行符(LF,`\n`)属于ASCII字符集(0-127范围): - CR:ASCII 13(十六进制 `0x0D`) - LF:ASCII 10(十六进制 `0x0A`) 在ANSIUTF-8编码中,ASCII字符的二进制表示完全一致[^1][^3]。 2. **编码格式对比** | 编码类型 | ASCII字符处理方式 | CR(`\r`)表示 | LF(`\n`)表示 | |----------|-------------------|--------------|--------------| | **ANSI** | 直接使用单字节 | `0x0D` | `0x0A` | | **UTF-8**| 保持单字节不变 | `0x0D` | `0x0A` | | UTF-16 | 扩展为双字节 | `0x000D` | `0x000A` | 因此UTF-8ANSI的换行符在二进制层面完全一致,而UTF-16会有差异(如SQL Server使用的情况)[^1]。 #### 验证示例 ```javascript // 在Node.js中验证 const ansiText = "ANSI文本\r\n换行"; const utf8Text = Buffer.from("UTF-8文本\r\n换行", 'utf8'); // 提取换行符部分 console.log( ansiText.charCodeAt(9).toString(16) ); // 输出: d (0x0D) console.log( ansiText.charCodeAt(10).toString(16) ); // 输出: a (0x0A) console.log( utf8Text.subarray(9, 11) ); // 输出: <Buffer 0d 0a> ``` #### 特殊场景说明 1. **混合编码问题** 当文件包含多种换行符类型(如`\r\n`、`\n`、`\r`混合)时,会出现跨平台兼容性问题[^2],但这与编码格式无关。 2. **UTF-8 BOM的影响** UTF-8文件可能包含BOM头(`EF BB BF`),但BOM**不会改变**换行符的二进制表示: ``` [BOM]EF BB BF | 文本内容 | 0D 0A ``` 3. **非ASCII字符的影响** 中文字符在ANSI(如GBK)UTF-8中的编码不同,但换行符始终不受影响: ```python # Python验证 gbk_text = "中文\r\n".encode('gbk') # 换行符仍为 b'\r\n' utf8_text = "中文\r\n".encode('utf8') # 换行符仍为 b'\r\n' ``` #### 实际应用建议 1. **文件转换时** 当ANSI文件转为UTF-8时,无需处理换行符: ```bash iconv -f GBK -t UTF-8 input.txt > output.txt ``` 2. **跨平台开发** 统一使用LF(`\n`)格式可避免兼容问题: ```git # .gitattributes 配置 * text=auto eol=lf ``` 3. **SQL Server处理** 需注意UTF-8UTF-16的转换,但换行符表示不变: ```sql -- 插入包含换行符的UTF-8文本 INSERT INTO Table VALUES (N'第一行\r\n第二行'); ``` --- ### 相关问题 1. 如何检测文本文件的编码格式(ANSI/UTF-8/UTF-16)? 2. 在跨平台开发中,如何统一换行符标准? 3. 处理包含BOM的UTF-8文件时需要注意什么? 4. SQL Server中如何处理多语言文本的换行符? 5. 不同编程语言读取文件时如何保持换行符一致性? [^1]: UTF-8UTF-16编码差异导致SQL Server处理Unicode时需要转换 [^2]: 混合换行符类型会导致跨平台兼容性问题 [^3]: ASCII字符在ANSIUTF-8中保持相同二进制表示
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值