前言:本文是对这篇博客What is the endian format in Oracle databases?[1]的翻译,如有翻译不当的地方,敬请谅解,请尊重原创和翻译劳动成果,转载的时候请注明出处。谢谢!

英文地址:https://dbtut.com/index.php/2019/06/27/what-is-the-endian-format-in-oracle-databases/

什么是字节序?

字节序(Endian)是多字节数据类型在内存中的存储方式。换句话说,它决定了数据的字节顺序。有两种字节序,小字节序(Little Endian)和大字节序(Big Endian)。

小字节序

数据先存储小端。也就是说,第一个字节是最大的。

另外一种翻译:将低序字节存储在起始地址。

大字节序

数据先存储大端。即第一个字节是最小的。

另外一种翻译:高序字节存储在起始地址。

例如:

假设一个整数存储为4个字节(32位),那么一个值为0x01234567(十进制表示)的变量将以0x01、0x23、0x45、0x67的形式存储。在具有大端的系统中,此数据按此顺序存储,而在小端系统中,它以相反的顺序存储。

Little Endian 和 Big Endian 的区别

下图显示了大端和小端的区别。

在 Oracle 数据库中,字节序格式由其工作环境中的字节序信息决定。数据库中的字节序格式告诉我们相关数据库可以移动到哪些环境。在不同的端序环境之间使用常规方法移动数据库是不可能的。例如,您不能用Data Guard 将数据库从 Little Endian系统传输到具有Big Endian的系统。

您可以用以下SQL查看数据库中的当前字节序格式。

SQL>selectname,platform_id,platform_namefromv$database;

NAMEPLATFORM_IDPLATFORM_NAME
------------------------------------------------------------------------------
ORCL13Linuxx8664-bit

以下查询显示了可以移动现有数据库的其他环境。

大端格式 (IBM AIX)

SQL>setlines200
SQL>setpages200
SQL>COL"Source"FORMa32
SQL>COL"CompatibleTargets"FORMa40
SQL>selectd.platform_name"Source",t.platform_name"CompatibleTargets",endian_format
fromv$transportable_platformt,v$databasedwheret.endian_format=(selectendian_formatfromv$transportable_platformt,v$databasedwhered.platform_name=t.platform_name)
orderby"CompatibleTargets";

SourceCompatibleTargetsENDIAN_FORMAT
------------------------------------------------------------------------------------------------------------------
AIX-BasedSystems(64-bit)AIX-BasedSystems(64-bit)Big
AIX-BasedSystems(64-bit)AppleMacOSBig
AIX-BasedSystems(64-bit)HP-UX(64-bit)Big
AIX-BasedSystems(64-bit)HP-UXIA(64-bit)Big
AIX-BasedSystems(64-bit)IBMPowerBasedLinuxBig
AIX-BasedSystems(64-bit)IBMzSeriesBasedLinuxBig
AIX-BasedSystems(64-bit)Solaris[tm]OE(32-bit)Big
AIX-BasedSystems(64-bit)Solaris[tm]OE(64-bit)Big

8rowsselected.

小端格式 (Linux x86)

SQL>setlines200
SQL>setpages200
SQL>COL"Source"FORMa32
SQL>COL"CompatibleTargets"FORMa40
SQL>selectd.platform_name"Source",t.platform_name"CompatibleTargets",endian_format
fromv$transportable_platformt,v$databasedwheret.endian_format=(selectendian_formatfromv$transportable_platformt,v$databasedwhered.platform_name=t.platform_name)
orderby"CompatibleTargets";

SourceCompatibleTargetsENDIAN_FORMAT
--------------------------------------------------------------------------------------
Linuxx8664-bitAppleMacOS(x86-64)Little
Linuxx8664-bitHPIAOpenVMSLittle
Linuxx8664-bitHPOpenVMSLittle
Linuxx8664-bitHPTru64UNIXLittle
Linuxx8664-bitLinuxIA(32-bit)Little
Linuxx8664-bitLinuxIA(64-bit)Little
Linuxx8664-bitLinuxx8664-bitLittle
Linuxx8664-bitMicrosoftWindowsIA(32-bit)Little
Linuxx8664-bitMicrosoftWindowsIA(64-bit)Little
Linuxx8664-bitMicrosoftWindowsx8664-bitLittle
Linuxx8664-bitSolarisOperatingSystem(x86)Little
Linuxx8664-bitSolarisOperatingSystem(x86-64)Little

12rowsselected.

下面是上文的中的SQL语句:

SETlines200
SETpages200
COL"Source"FORa32
COL"CompatibleTargets"FORa40
SELECTd.platform_name"Source",
t.platform_name"CompatibleTargets",
endian_format
FROMv$transportable_platformt,
v$databased
WHEREt.endian_format=
(SELECTendian_format
FROMv$transportable_platformt,
v$databased
WHEREd.platform_name=t.platform_name)
ORDERBY"CompatibleTargets";

参考资料

[1]

原文地址: https://dbtut.com/index.php/2019/06/27/what-is-the-endian-format-in-oracle-databases/

扫描上面二维码关注我如果你真心觉得文章写得不错,而且对你有所帮助,那就不妨帮忙“推荐”一下,您的“推荐”和”打赏“将是我最大的写作动力!本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接.