sql - Oracle - 插入数据时出现“值太大”错误
问题描述
我正在尝试在 oracle 11g 中插入 Northwind 示例数据库。虽然它主要工作,但对于一些插入查询我得到以下错误 -
ORA-12899: 列 "SYSTEM"."CUSTOMERS"."CITY" 的值太大(实际值:16,最大值:15)
数据看起来像 -
Insert into CUSTOMERS
(CUSTOMER_ID, CUSTOMER_CODE, COMPANY_NAME, CONTACT_NAME, CONTACT_TITLE, ADDRESS, CITY, REGION, POSTAL_CODE, COUNTRY, PHONE, FAX)
Values
(35, 'HILAA', 'HILARIÓN-Abastos', 'Carlos Hernández', 'Sales Representative',
'Carrera 22 con Ave. Carlos Soublette #8-35', 'San Cristóbal', 'Táchira', '5022', 'Venezuela',
'(5) 555-1340', '(5) 555-1948');
请注意城市值中的特殊 Ã。当我用普通 A 替换那个特殊字符时,它被成功插入。
Insert into CUSTOMERS
(CUSTOMER_ID, CUSTOMER_CODE, COMPANY_NAME, CONTACT_NAME, CONTACT_TITLE, ADDRESS, CITY, REGION, POSTAL_CODE, COUNTRY, PHONE, FAX)
Values
(35, 'HILAA', 'HILARIÓN-Abastos', 'Carlos Hernández', 'Sales Representative',
'Carrera 22 con Ave. Carlos Soublette #8-35', 'San CristA³bal', 'Táchira', '5022', 'Venezuela',
'(5) 555-1340', '(5) 555-1948');
我没有减少字符数。当数据长度没有改变时,为什么oracle会出现这样的错误?
解决方案
我没有减少字符数。当数据长度没有改变时,为什么oracle会出现这样的错误?
因为number of characters not always = no of bytes
. 当数据库字符集为 UTF-8(一般为 true)时,有些字符需要超过 1 个字节才能存储在数据库中。
为了验证这一点,您可以使用函数LENGTH
,它给出字符长度和LENGTHB
字节长度。
SELECT
length('A'),
length('Ã'),
lengthb('A'),
lengthb('Ã')
FROM
dual;
LENGTH('A') LENGTH('Ã') LENGTHB('A') LENGTHB('Ã')
----------- ----------- ------------ ------------
1 1 1 2
因此,如果已将列定义为VARCHAR2( n BYTE)
and not VARCHAR2( n CHAR)
,那么当您尝试插入一个字符串时会引发此错误,每个字符需要超过 1 个字节,例如Ã
作为一个例子考虑这个
create table test_byte( c VARCHAR2(1 byte) );
INSERT INTO test_byte(c) VALUES('Ã');
ORA-12899: value too large for column "HR"."TEST_BYTE"."C" (actual: 2,
maximum: 1)
但是,如果我将列指定为1 CHAR
,则插入有效。
create table test_byte2( c VARCHAR2(1 char) );
INSERT INTO test_byte2(c) VALUES('Ã');
1 row inserted.
有关详细信息,请参阅此问题:BYTE and CHAR in column datatypes 的区别
推荐阅读
- r - 检查函数中的字符条目是否在 R 中的向量集中
- sql-server - 购买商品并在 SQL Server 中保存供应商的名称
- python - DecisionTreeClassifier 中两片叶子之间的距离
- powershell - 在几个路径中递归地计算文件,在 Powershell 中排除和消除冗余文件
- azure - azure devops 访问日志
- python - 使用 Python 密码保护 Excel 文件
- sql - 获取最后一条消息 postgres
- python - 'float' 对象在 python 中不可迭代
- python - 从 django 中的文件添加选项
- python - Scipy最小化熊猫df中的约束