为什么SQL中的CHAR(1)占用1个字节,而Java中的char占用2个字节?

时间:2019-03-21 18:37:07

标签: java sql char character

我正在读SQL / 92(我是新手),它经历了不同的数据类型。其中之一是CHAR,我当然知道它与java中的String非常相似,而不是java中的char。但是,让我们假设它是CHAR(1)。只是一个字符。

在SQL / 92中,它说每个字符都是8位。但是,在Java中,一个字符是16位。另外,一个角色通常占用16位吗?

请注意,这不是重复的,因为我不是在问CHAR和VARCHAR或SQL char与unicode ascii char之间的区别。

所以我的问题是:为什么Java 16位为char,SQL / 92 8位为CHAR(1)?

-谢谢

2 个答案:

答案 0 :(得分:4)

当支持扩展ASCII似乎足够好时,就开发了SQL和C。在拉丁语言中,它当然工作得很好。尤其是在美国。

后来,Unicode的使用范围更加广泛,因此可以在更多需要较宽字符的国家/地区使用。较新的Java开始支持从0到65535的Unicode。

注意:从那时起,Unicode现在需要超过16位,并且Java支持UTF-16甚至更宽的字符,例如表情符号。

事后看来,char应该是unsigned int,而Character类现在支持int的“代码点”

Java 9+现在可以在字符串中的每个字符使用8位,以节省空间。 ;)

答案 1 :(得分:4)

  

另外,一个角色通常占用16位吗?

从历史上看,一个字符占用7(ASCII)或8(EBCDIC或“扩展ASCII”)位。

Unicode为每个字符分配一个介于0到0x10FFFF之间的整数“代码点”,因此在最直接的编码中,每个字符为21位。

(好吧,不完全是。由于结合了字符和连字,字符串中的Unicode代码点的数量可能与用户可感知的字符的数量不同。但是为了简单起见,我假设一对一“字符”和“代码点”之间的一种对应。)

有三种将Unicode字符编码为“代码单位”的常用方法:

  • UTF-32是最直接的一个:每个字符都被编码为单个32位代码单元。 (这“浪费”了11位,但是很容易在32位或64位计算机上实现。)
  • UTF-16将一个16位代码单元用于“基本多语言平面”字符,并将两个单元的“代理对”用于其他字符(包括大多数表情符号)。
  • UTF-8每个字符使用1到4个字节。对于从7位US-ASCII继承的字符进行了“优化”,每个字符仅占用一个字节。

这三种编码形式都可以代表所有Unicode字符,但是在内存使用和处理便利性方面都不同。

  

所以我的问题是:为什么Java 16位为char,SQL / 92 8位为CHAR(1)?

历史原因。 SQL是在1970年代开发的,当时国际化的软件没什么大不了的,简单的8位字符编码对于英语或其他带有字母书写系统的语言来说已经足够了。 (对于东亚人来说,情况要复杂得多。)

Java于1990年代初开发,距Unicode引入不久。当时,Unicode认为16位对于每个人都足够了,因此16位字符是新平台的明显选择。 (Windows NT大约是在同一时间开发的,并且也使用UTF-16字符串。)

已使用其他字符类型对已经广泛使用的语言进行了改进,以表示这些新的“宽”字符:C和C ++获得了new,SQL获得了deletewchar_t