PDA

View Full Version : Sql Data type !



malefly
17-04-2005, 21:44
Tôi tạo 1 cơ sở dữ liệu để lưu trữ 1 lượng lớn dữ liệu là unicode nên tôi tạo 1 column có kiểu dữ liệu là ntext(support unicode) nhưng khi tôi nhập dữ liệu vào tôi chỉ nhập được khoảng 500 ký tự kể cả khoảng trắng . Mặc dù kiểu dữ liệu ntext cho phép lưu trữ dữ liệu trên 1 tỷ ký tự unicode bạn nào có thể giải thích giùm tại sao ko ?
Xin cảm ơn

malefly
18-04-2005, 20:33
1 câu hỏi nhỏ mà ko ai trả lời được sao ?

malefly
21-04-2005, 12:30
1 diễn đàn lớn nhưng kiến thức thật nhỏ !
chán thật

tommyle
21-04-2005, 12:37
1 diễn đàn lớn nhưng kiến thức thật nhỏ !
chán thật
http://google.com
help yourself!

phatnq2003
21-04-2005, 12:42
Tôi tạo 1 cơ sở dữ liệu để lưu trữ 1 lượng lớn dữ liệu là unicode nên tôi tạo 1 column có kiểu dữ liệu là ntext(support unicode) nhưng khi tôi nhập dữ liệu vào tôi chỉ nhập được khoảng 500 ký tự kể cả khoảng trắng . Mặc dù kiểu dữ liệu ntext cho phép lưu trữ dữ liệu trên 1 tỷ ký tự unicode bạn nào có thể giải thích giùm tại sao ko ?
Xin cảm ơn

Bạn nhập ở đâu? Nếu bạn nhập trong một textbox của một Form VB thì hiển nhiên là không thể nhập hơn được rồi? Bởi lúc này số ký tự bị khống chế bởi kiểu String của VB chứ không phải là do kiểu của dữ liệu.
:shifty:

itgatevn
22-04-2005, 00:39
Bạn nhập ở đâu? Nếu bạn nhập trong một textbox của một Form VB thì hiển nhiên là không thể nhập hơn được rồi? Bởi lúc này số ký tự bị khống chế bởi kiểu String của VB chứ không phải là do kiểu của dữ liệu.

Tôi có ý kiến tí nha, trước hết là kiểu tring của VB thì không phải chỉ là 500 ký tự đâu.
Còn việc bạn khai báo kiểu ntext mà nhập không đươc đó là:
- bạn nhập trong enterprise thì chắc chắn không được rồi vì trong enterprise không cho nhập nhiều ký tự đâu;
- Để nhập được dữ liệu dài vào column có kiểu ntext bạn nên nhập bằng code là hay nhất, có nghĩa là, tạo một cái textbox, rồi đánh text vào đó, sau đó truyền giá trị .Text của cái textbox này cho một biến kiểu string, và sau đó dùng câu lệnh để connect đến database và thực hiện câu insert, bạn làm thử nha, không được lên đây chửi mình nè, hihihihihi
Không có ai trả lời là không phải không ai biết đâu, ví dụ như mình, mình thường ở box .NET nên lâu lâu ghé vào Box VB một tí, từ sau mình sẽ vào box này thường, hi vọng sẽ giúp được các bạn, hoặc các bạn có thể tham gia www.itgatevn.com để hỏi trực tiếp mình.

Thân chào

malefly
22-04-2005, 07:30
Cảm ơn ITgate rất nhiều vì có 1 câu trả lời thật hoàn hảo và chính xác ! Tuy nhiên điều này tớ phải kiểm tra lại mới được vì chưa làm như cậu nói . đúng là tớ mở Enterprise ra và copy dữ liệu trong word. Tớ đọc rất kỹ về chủ đề này trong SQL Server online Book họ nói kiểu dữ liệu này chứa đến 2G tuy nhiên khi mở Enterprise ra copy và past vào thử thì không như thế . Giờ mới biết nguyên nhân


1 lần nữa thanks to ITgatevn

itgatevn
22-04-2005, 13:13
không có chi đâu bạn, mình cùng học hỏi nha,

có gì bạn cứ post lên đây, hoặc post tại www.itgatevn.com (đây là site của mình mới mở) mình sẽ ok liền.

hihihihih
thân chào bạn.

malefly
27-04-2005, 10:40
gởi itgatevn:
Tôi đã thử nhập vào sữ dụng lệnh y như cậu nói Tuy nhiên khi nhập vào nó báo lỗi sau:

Cannot create a row of size 32368 which is greater than the allowable maximum of 8060. The statement has been terminated.
Vậy cậu giải quyết nó thế nào đây ? có giải pháp nào để lưu 1 lượng text lớn vậy ?

xbacala
27-04-2005, 14:18
Không thể nào đâu. Thử check lại xem !
Bản thân field NTEXT chỉ tốn có 16bytes trong row size thôi mà. !

malefly
27-04-2005, 16:53
Cậu có lộn không vậy trong SQL Server thì NText là kiểu dữ liệu lớn thứ nhất nhì đấy
nó chứa trên 2G dữ liệu
cậu nên xem kỹ lại đi

xbacala
27-04-2005, 18:18
Dĩ nhiên là tui biết rồi !

Bạn 0 thấy tui nói là "chỉ tốn có 16 bytes trong row size" thôi sao.Có nghĩa là khi bạn dùng field NTEXT, mỗi row sẽ tốn 16 byte lưu trữ tính vào row size. Giá trị 16 này được tính trong con số 8060 cho dù bạn có lưu dài bao nhiêu đi chăng nữa. Nguyên nhân là do field này chỉ chứa cái pointer đến vùng lưu trữ thật sự giá trị của field NTEXT, do đó độ dài của field 0 đc tính vào cho limit row size vì nó được lưu trữ ở nơi khác trong các data page khác với data page của row.

Sẵn đây cũng nói luôn nguyên nhân SQL Server 2K chỉ cho phép lưu nhiều nhất 8060bytes/row là do SQL Server 2000 nó lưu data theo page, 1 page =8K và SQL Server 2K nó 0 xử lý đc tình huống 1 row extend trên nhiều page(row chain). Do đó, hạn chế 1 row trên 1 page =8K =8192 bytes. SQL Server dùng 1 số byte để lưu trữ row information nên cuối cùng còn lại 8060. Đây là hạn chế mà SQL Server 2000 còn thua Oracle 9i

Hiện nay, version SQL Server 2005 đã khắc phục yếu kém này nên bà con khoải lo nữa !

itgatevn
27-04-2005, 23:22
chào bạn malefly,
tôi không biết là bạn làm thế nào, nhưng với kiểu ntext, nếu dùng code để nhập vào, thì bạn khỏi lo về độ dài nữa, nó chỉ báo lỗi khi ta nhập vào cái En như anh xbacala nói thôi.

Nếu không được nữa, hãy gởi mail cho tôi, tôi sẽ cho bạn đoạn code để làm nhanh chóng.

thân chào