【问题标题】:How to insert french number format in oracle SQL table如何在oracle SQL表中插入法国数字格式
【发布时间】:2015-12-30 09:40:28
【问题描述】:

我面临在 oracle 的数字字段中插入法国数字的问题。我正在使用 SQL Developer IDE。当我插入数字(比如 3,4)时,它说无效数字。具体来说,

我不想将值 3,4 替换为 3.4。

我也尝试更改 NLS 设置(使用命令

Alter session set NLS_NUMERIC_CHARACTERS=','; 

如果我使用此命令,我可以直接在编辑器中插入,但插入命令由于逗号而不起作用,Oracle 假定它是另一个值。

任何帮助将不胜感激。

【问题讨论】:

  • 不能用逗号插入数值,而是使用varchar数据类型
  • @MuhammadMuazzam:永远不会在 varchar 列中存储数字。这是一个非常糟糕的建议
  • @MuhammadMuazzam 你看到的不是它在数据库中的存储方式。逗号和点是分隔符,仅用于显示目的。例如,stackoverflow.com/questions/33145216/…
  • @MuhammadMuazzam 所以?你还是没明白。数字在内部存储为可变大小。在内部它是尾数和指数。分隔符仅用于显示,而不是存储您看到的方式。
  • @mcapatna 您不能在 NUMBER 数据类型中存储分隔符。你只是在谈论显示

标签: sql oracle


【解决方案1】:

你不能也不需要。

SQL 的数字格式literals 需要. 作为小数分隔符。

在列本身中根本不存储小数分隔符。您只需要更改数字的显示格式。理想情况下,这是在您的应用程序中完成的,不是在 SQL 级别。但如果您在 SQL 输出中需要此功能,请使用 to_char() 格式化您的数字:

select to_char(your_number_column, '9999D99')
from your_table;

格式掩码中的D 将替换为当前会话的 NLS 设置定义的小数分隔符。

一个点 ., 按字面意思返回:

select to_char(your_number_column, '9999,99')
from your_table;

有关 to_char() 格式掩码的更多详细信息可以在手册中找到:
https://docs.oracle.com/cd/E11882_01/server.112/e41084/sql_elements004.htm#BABIGFBA

【讨论】:

  • 是否有任何设置允许跳过to_char 部分并将其设为默认,,但不允许.
【解决方案2】:

您的应用程序/ide 可能正在执行字符数据到数字的隐式转换,它使用会话默认的 nls_numeric_characters。 您可以使用 to_number 强制插入命令执行如下显式转换:

SQL> alter session set nls_language = ENGLISH;
Session altered
SQL> alter session set nls_numeric_characters = ',.';
Session altered
SQL> create table t1 (num_col number);
Table created
SQL> insert into t1 (num_col) values ('3.4');
insert into t1 (num_col) values ('3.4')
ORA-01722: invalid number
SQL> -- this is equivalent to:
SQL> insert into t1 (num_col) values (to_number('12345,678', '999999D999', 'NLS_NUMERIC_CHARACTERS=.,'));
insert into t1 (num_col) values (to_number('12345,678', '999999D999', 'NLS_NUMERIC_CHARACTERS=.,'))
ORA-01722: invalid number
SQL> -- now converting explictly
SQL> insert into t1 (num_col) values (to_number('12.345,678', '999999D999', 'NLS_NUMERIC_CHARACTERS=,.'));
1 row inserted
SQL> insert into t1 (num_col) values (to_number('12345,678', '999999D999', 'NLS_NUMERIC_CHARACTERS=,.'));
1 row inserted

在 NLS_NUMERIC_CHARACTERS 中,第一个字符是小数分隔符,第二个字符是千位分组标记。

文档有更多信息: https://docs.oracle.com/cd/B28359_01/olap.111/b28126/dml_functions_2117.htm

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-10-27
    • 2016-06-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-04
    相关资源
    最近更新 更多