Oracle数据库字符集为EE8ISO8859P2,如何插入UTF8语言数据?
解决方案:不改数据库字符集存储多语言数据
先给你说清楚为啥你用CONVERT会出问号——EE8ISO8859P2是针对东欧语言的字符集,阿拉伯语、俄语的字符根本不在这个字符集的编码范围内,转的时候找不到对应编码,自然就变成问号了,所以这个方法行不通。
不用改数据库字符集的话,有两个靠谱的办法,都是绕开当前字符集限制来存储Unicode数据:
1. 使用NVARCHAR2/NCHAR类型存储
Oracle的NVARCHAR2和NCHAR类型是专门用来存储Unicode数据的,底层用UTF-16编码,不管数据库的默认字符集是什么,都能完美保存阿拉伯语、俄语这类非东欧语言的字符。
具体操作:
- 调整字段类型:把原来的
VARCHAR2字段改成NVARCHAR2(固定长度场景用NCHAR),比如:ALTER TABLE your_table MODIFY (lang_content NVARCHAR2(200)); - 插入数据:插入时要在字符串前加
N前缀,明确告诉Oracle这是Unicode字符串:INSERT INTO your_table (lang_content) VALUES (N'العربية'); -- 阿拉伯语 INSERT INTO your_table (lang_content) VALUES (N'Русский'); -- 俄语 - 查询数据:直接查询即可,Oracle会自动处理编码转换,正常显示字符:
SELECT lang_content FROM your_table;
2. 用二进制类型(RAW/BLOB)存储UTF-8字节
如果没法修改现有字段类型,那就把多语言字符串转成UTF-8的二进制字节存储,查询时再转回来,这样不会丢失任何字符信息。
具体操作:
- 插入数据:用
UTL_I18N.STRING_TO_RAW函数把UTF-8字符串转成RAW类型插入:INSERT INTO your_table (binary_col) VALUES (UTL_I18N.STRING_TO_RAW('العربية', 'AL32UTF8')); INSERT INTO your_table (binary_col) VALUES (UTL_I18N.STRING_TO_RAW('Русский', 'AL32UTF8')); - 查询数据:用
UTL_I18N.RAW_TO_STRING函数把RAW二进制转回UTF-8字符串:SELECT UTL_I18N.RAW_TO_STRING(binary_col, 'AL32UTF8') AS display_text FROM your_table;
内容的提问来源于stack exchange,提问作者WEBCENTER
相关产品推荐
相关产品推荐

