什么是PostgreSQL等效于SQL Server NVARCHAR?

时间:2009-08-07 14:53:21

标签: postgresql

如果我在Microsoft SQL Server数据库中有NVARCHAR(或NTEXT)数据类型的字段,那么PostgreSQL数据库中的等效数据类型是什么?

4 个答案:

答案 0 :(得分:32)

我很确定postgres varchar与Oracle / Sybase / MSSQL nvarchar相同,即使它在手册中没有明确说明:

http://www.postgresql.org/docs/7.4/static/datatype-character.html

编码转换函数在这里:

http://www.postgresql.org/docs/current/static/functions-string.html http://www.postgresql.org/docs/current/static/functions-string.html#CONVERSION-NAMES

示例:

create table
nvctest (
utf8fld varchar(12)
);
insert into nvctest
select convert('PostgreSQL' using ascii_to_utf_8);
select * from nvctest;

此外,对于来自Postgresql代表的类似问题有this response

  

我们所有的TEXT数据类型都是   多字节能力,只要你有   正确安装了PostgreSQL   这包括:TEXT(推荐)   VARCHAR CHAR

答案 1 :(得分:10)

它是 varchar text ,假设您的数据库采用UNICODE编码。如果您的数据库采用非UNICODE编码,则没有特殊的数据类型可以为您提供unicode字符串 - 您可以将其存储为bytea流,但这不是字符串。

答案 2 :(得分:7)

标准TEXT数据类型非常适合它。

答案 3 :(得分:3)

简短答案:没有与SQL Server NVARCHAR等效的PostgreSQL。

不同数据库上NVARCHAR(N)的类型不相同。 该标准允许选择字符排序规则和编码/字符集。在处理unicode时,PostgreSQL和SQLServer属于不同的阵营,不存在对等关系。

这些有所不同

  1. 长度语义
  2. 可表示的内容
  3. 排序顺序
  4. 填充语义

因此,将数据从一个数据库系统(或编码/字符集)移动到另一个数据库系统可能会导致截断/内容丢失

特别是,在PostgreSQL(9.1)字符类型和SQL Server NVARCHAR之间没有等效项

您可以将数据迁移到PostgreSQL二进制类型,但随后将失去文本查询功能。

(除非PostgreSQL开始支持基于UTF-16的unicode字符集)

1)长度语义

根据数据库和编码,对N的解释不同(字符,字节,2 * N =字节)。

Microsoft SQL Server使用UCS2编码,并将VARCHAR长度解释为UCS-2点,即length * 2 =字节长度(https://docs.microsoft.com/en-us/sql/t-sql/data-types/nchar-and-nvarchar-transact-sql?view=sql-server-2017):
  它们的NVARCHAR(1)可以存储1个UCS2字符(UCS2的2个字节)。 Oracle UTF编码具有相同的语义(和内部CESU-8存储)。

Postgres 9.1仅具有Unicode UTF-8字符集(https://www.postgresql.org/docs/9.1/multibyte.html),该字符集与 Oracle(采用AL32UTF8或AL16UTF16编码)可以存储1个完整的UCS32代码点。最多可能有4个字节(例如,请参见 明确声明NVARCHAR2(50)列的http://www.oracletutorial.com/oracle-basics/oracle-nvarchar2/可能最多占用200个字节。

在处理基本多语言平面之外的字符时,这种区别变得很明显,这些字符在utf8 ucs32(go,char,char32_t,PostgreSQL)中被视为一个“ char单位”,但在UTF-16中被表示为代理对,该对被视为两个单位(Java,Javascript,C#,ABAP,wchar_t和SQLServer)。

例如 带有微笑眼睛的U + 1F60A微笑面将耗尽SQL Server NVARCHAR(2)中的所有空间。 但是在PostgreSQL中只有一个字符单元。

古典企业级数据库将提供至少一种带有UTF-16之类的语义的选择(SAP HANA(CESU-8),具有排序规则的DB 2,SQL Anywhere(CESU8BIN)等)。 例如。 Oracle还提供了他们误导性的UTF-8排序规则,实际上就是CESU-8。 它具有相同的长度语义,可表示的内容与UTF-16(= Microsoft SQL Server)相同,是基于UTF-16的企业系统(例如SAP R / 3)或Java应用程序服务器下使用的合适归类。

请注意,即使使用可变长度的unicode编码,某些数据库仍可能将NVARCHAR(N)解释为字节限制的长度(示例SAP IQ)。

2)无法代表的内容

基于UTF-16 / CESU-8的系统可以代表一半代理对,而 基于UTF-8 / UTF-32的系统不能。 此内容在此字符集中无法表示,但在基于UTF-16的企业系统中经常出现。 (例如Windows路径名可能包含此类非utf-8可表示的字符,请参见例如https://github.com/rust-lang/rust/issues/12056)。 因此,UTF-16是UTF-8 / UTF-16的“超集”,当基于这种编码(SAP,Windows,Java,JavaScript)处理来自企业/操作系统的数据时,它通常是一个杀手标准。请注意,JavaScript JSON编码特别注意能够表示这些字符(https://tools.ietf.org/html/rfc8259#page-10)。

(2)和(3)在迁移查询时更为相关,但与数据迁移无关。

3)二进制排序顺序:

请注意,CESU-8 / UTF-16的二进制排序顺序不同于UTF-8 / UTF-32。

UTF-16 / CESU-8 / Java / JavaScript / ABAP排序顺序:

U+0041  LATIN CAPITAL LETTER A
U+1F60A SMILING FACE WITH SMILING EYES
U+FB03  LATIN SMALL LIGATURE ffi 

UTF-8 / UCS-32(go)排序顺序:

U+0041  LATIN CAPITAL LETTER A
U+FB03  LATIN SMALL LIGATURE ffi 
U+1F60A SMILING FACE WITH SMILING EYES

4)填充语义

在数据库上,填充语义有所不同。将VARCHAR与CHAR内容进行比较时。