PDA

View Full Version : Unicode trong Oralce9i



trauvang
01-12-2004, 16:25
Chào các bác,

Các bác nào biết về vụ này không. Tôi đang học Oracle9i, muốn Insert vào Table chuỗi ký tự unicode.

Tôi dùng isqlplus (browser với Encoding UTF-8) để tạo Table, trong đó có một column kiểu nvarchar2(35) với mục đích lưu chuỗi Unicode, cụ thể như sau:

Create Table NhanVien(Ma char(10) primary key, Ten nvarchar2(35));

Insert Into NhanVien Values('NV01', 'Nguyễn Văn Tuấn');


Tôi đã thử insert theo cách viết bên MS SQL Server:

Insert Into NhanVien Values('NV01', n'Nguyễn Văn Tuấn'); hay
Insert Into NhanVien Values('NV01', N'Nguyễn Văn Tuấn');

nhưng chuỗi ký tự unicode toàn hiển thị toàn dấu chấm hỏi.

Các bác giúp mình với. Hi vọng sớm nhận được sự giúp đỡ của các bác.
Cảm ơn,

Trâu vàng.

cadiec
01-12-2004, 18:01
Vấn đề hay đấy nhưng theo tôi biết thì chưa thể Insert tiếng việt vào Oracle DB đâu không hiểu Oracle hỗ trợ Unicode ntn nhưng hiện tại muốn lưu tiếng Việt phải chấp nhận không hiển thị đúng.

coitri
01-12-2004, 20:58
Vấn đề hay đấy nhưng theo tôi biết thì chưa thể Insert tiếng việt vào Oracle DB đâu không hiểu Oracle hỗ trợ Unicode ntn nhưng hiện tại muốn lưu tiếng Việt phải chấp nhận không hiển thị đúng.

Bậy thế,
Vào trong registry, tìm đến HK_LC_MC\Software\ORACLE
Nhìn qua cái panel bên phải, nếu có NLS_LANG thì sửa thành AMERICAN_AMERICA.UTF8, nếu chưa có thì tạo mới 1 String Value và set giá trị như thế.

ti_sun
02-12-2004, 10:44
Muốn lưu trữ tiếng Việt Unicode UTF-8, trong lúc tạo mới Database, bạn phải chọn NLS_CHARACTERSET và NLS_NCHAR_CHARACTERSET là UTF8. hoặc bạn có thể sửa lại CHARACTERSET bằng 02 cách:
1. Dùng Oracle Enterprise Manager Console: Đăng nhập với quyền SYSDBA, vào SCHEMA> SYS>TABLES. Nhấn chuột phải vào table PROPS$, chọn View/Edit Content, sửa lại giá trị 02 dòng characterset kể trên là UTF8. Restart lại Oracle Database Instance.
2. Dùng lệnh trong sqlplus:

SQL> SHUTDOWN IMMEDIATE;
SQL> STARTUP MOUNT;
SQL> ALTER SYSTEM ENABLE RESTRICTED SESSION;
SQL> ALTER SYSTEM SET JOB_QUEUE_PROCESSES=0;
SQL> ALTER SYSTEM SET AQ_TM_PROCESSES=0;
SQL> ALTER DATABASE OPEN;
SQL> ALTER DATABASE CHARACTER SET <new_character_set_name>; -- UTF8;
SQL> ALTER DATABASE NATIONAL CHARACTER SET <new_character_set_name>; --UTF8;
SQL> SHUTDOWN IMMEDIATE; -- OR NORMAL
SQL> STARTUP RESTRICT;
* Đặt lại giá trị JOB_QUEUE_PROCESSES
SQL> SHUTDOWN IMMEDIATE;
SQL> STARTUP MOUNT;
SQL> ALTER SYSTEM ENABLE RESTRICTED SESSION;
SQL> ALTER SYSTEM SET JOB_QUEUE_PROCESSES=<Giá trị lớn hơn 0, mặc định là 10>;
SQL> ALTER DATABASE OPEN;

Ngoài ra, bạn nên chỉnh lại giá trị NLS_LANG trong Registry:
HKEY_LOCAL_MACHINE>SOFTWARE>ORACLE>HOME0:NLS_LANG = 'AMERICAN_AMERICA.UTF8'

Chúc bạn thành công.

trauvang
02-12-2004, 12:10
Hi ti_sun,

Trước tiên mình rất cảm ơn về sự giúp đỡ của bạn. Nhưng mình có thêm một thắc mắc mong bạn có thể giúp. Đó là: nếu chúng ta chỉ set NLS_NCHAR_CHARACTERSET = AL16UTF8/UTF8, mà không set NLS_CHARACTERSET = UTF8 thì có được không. Vì nếu set tất cả 2 tham số trên thì chỉ cần khai báo kiểu dữ liệu char, varchar thì nó có thể chứa dữ liệu Unicode mà không cần kiểu nchar, nvarchar.

Với việc set 2 tham số sang UTF8 thì sẽ hơi lãng phí không gian đĩa cứng (tốn không gian gấp đôi) vì có nhiều số field không cần dùng font Unicode.

Mình đã đọc ở đâu đó lời khuyên là chỉ nên dùng kiểu dữ liệu 2 byte nchar... khi cần thiết, còn các trường hợp còn lại thì nên dùng kiểu 1 byte.

Rất mong hồi âm của bạn.

Thân chào,
Trâu Vàng.

ti_sun
03-12-2004, 16:42
Chào trauvang !
Khi bạn dùng mã hóa UTF8, độ dài kí tự sẽ được lưu từ 1 đến 4 bytes (nôn na là ảnh hưởng bởi có dấu hay không dấu). Vì vậy, độ dài của trường dữ liệu dựa vào tính chất dữ liệu của trường đó có dấu hay không, và do bạn quyết định lúc tạo bảng.
Tí sún.

trauvang
04-12-2004, 09:39
Cảm ơn Tí Sún nhiều nhé.

Thân,
Trâu Vàng.

cadiec
10-12-2004, 20:32
Tôi muốn hỏi trực tiếp đã có bạn nào làm ra được kết quả theo hướng dấn ở trên chưa thì cho mọi người biết với. Các bạn nên xem rõ yêu cầu là phải ra được tiếng Việt khi select tại cửa sổ SQL*Plus chứ không phải bằng công cụ (tool) của Oracle DB. Lưu và hiển thị được tại SQL*Plus - điều này liên quan tới việc sắp xếp, tìm kiếm - thì mới khó chứ còn chỉ lưu và hiển thị tiếng việt thì không phải là khó.

ti_sun
11-12-2004, 12:16
SQL*PLUS không hỗ trợ tiếng Việt cho bạn đâu. Trauvang đang nói tới cái isqlplus đó.
Nếu bạn có cài Oracle HTTPServer (cài đầy đủ bộ Oracle 9i -> mặc nhiên là có) thì bạn có thể truy suất đến DataBase thông qua isqlplus:
+http://{Oracle HTTPServer Name}:port1/isqlplus
+https://{Oracle HTTPServer Name}:port2/isqlplus
* {Oracle HTTPServer Name}: Tên máy hoặc IP của máy cài Oracle HTTPServer, (thường là máy cài DataBase).
* port1: mặc định là 7778
* port1: mặc định là 4443
Ví dụ: Tên máy là TI_SUN
_http://TI_SUN:7778/isqlplus
Khi sử dụng isqlplus, máy truy suất chỉ cần có 1 Web Browser bất kì (IE, Mozilla, ...), không yêu cầu phải cài Oracle Client như SQL*PLUS.

cadiec
13-12-2004, 08:36
isqlplus thì cũng chỉ là sqlplus trên explorer mà thôi. Bây giờ làm sao mà dùng Unicode để đưa được tiếng Việt vào DB đây mọi người cùng tìm hiểu xem có cách nào hay không.

trauvang
14-12-2004, 09:11
Chào cadiec,

Cách đưa dữ liệu vào DB mình đã đưa ra ở bài đâu tiên thông qua câu Insert Into rồi đó. Bạn xem lại bài đầu tiên đi nhé.

Chúc thành công,
Trâu Vàng.

vietnt
12-01-2005, 15:03
Tại sao không để là varchar2 mà lại để là nvarchar2 ?