2008-09-16 38 views
11

Tôi đang làm việc với một cơ sở dữ liệu khá đơn giản, từ một ứng dụng Java. Chúng tôi đang cố gắng chèn khoảng 200k văn bản cùng một lúc, sử dụng bộ điều hợp JDBC mysql chuẩn. Chúng tôi liên tục nhận được một com.mysql.jdbc.MysqlDataTruncation: Cắt dữ liệu: Dữ liệu quá dài cho lỗi cột.Lỗi dữ liệu MySQL

Loại cột là văn bản dài và collation cơ sở dữ liệu là UTF-8. Lỗi hiển thị bằng cách sử dụng cả hai bảng MyISAM và InnoDB. Kích thước gói tối đa đã được đặt ot 1 GB trên cả hai phía máy khách và máy chủ, do đó không được gây ra sự cố.

Trả lời

4

Bạn cũng có thể làm cho nó bỏ qua lỗi bằng cách thực hiện INSERT IGNORE, điều này sẽ chỉ cắt ngắn dữ liệu và chèn nó vào. (Từ http://dev.mysql.com/doc/refman/5.0/en/insert.html)

Nếu bạn sử dụng từ khoá bỏ qua, lỗi xảy ra trong khi thực hiện câu lệnh INSERT được coi là cảnh báo để thay thế. Ví dụ: nếu không có IGNORE, một hàng trùng lặp một chỉ số UN2QUE hoặc giá trị PRIMARY KEY hiện có trong bảng gây ra lỗi khóa trùng lặp và câu lệnh bị hủy bỏ. Với IGNORE, hàng vẫn không được chèn, nhưng không có lỗi nào được phát hành. Dữ liệu chuyển đổi sẽ kích hoạt lỗi hủy bỏ tuyên bố nếu IGNORE không phải là được chỉ định. Với IGNORE, các giá trị không hợp lệ được điều chỉnh theo các giá trị gần nhất và được chèn vào; cảnh báo được sản xuất nhưng tuyên bố không bãi bỏ.

2

Nghe có vẻ như tôi đang cố gắng đặt quá nhiều byte vào một cột. Tôi đã gặp một lỗi rất giống với MySQL tối qua do lỗi trong mã của tôi. Tôi có nghĩa là để làm

foo.status = 'inactive' 

nhưng đã thực sự gõ

foo.state = 'inactive' 

đâu foo.state được coi là một mã hai ký tự cho một nhà nước Mỹ (varchar (2)). Tôi đã gặp lỗi tương tự như bạn. Bạn có thể tìm kiếm một tình huống tương tự trong mã của bạn.

10

Kiểm tra xem dữ liệu UTF-8 của bạn có phải là tất cả Unicode 3 byte hay không. Nếu bạn có các ký tự 4 byte (hợp pháp trong Unicode và Java, bất hợp pháp trong MySQL 5), nó có thể ném lỗi này khi bạn cố gắng chèn chúng. Đây là số issue that should be fixed trong MySQL 6.0.

+0

làm thế nào tôi có thể kiểm tra xem dữ liệu UTF-8 của tôi là tất cả 3-byte Unicode? – JAVAGeek

+0

@JAVAGeek: Câu hỏi hay, có lẽ nên được hỏi riêng. Có nhiều cách khác nhau. Trên đỉnh đầu của tôi, một cách có thể hoạt động trong Java là kiểm tra xem có bất kỳ điểm mã nào trong chuỗi được biểu diễn bằng nhiều hơn một ký tự không, như sau: 's.length() == s.toCharArray () .length'. Nếu điều đó đúng, 's' có cùng số điểm và ký tự mã, do đó sẽ chỉ có các ký tự BMP được biểu diễn bằng UTF-8 lên tới 3 byte. – Avi

1

Tôi vừa mới nhấn vấn đề này và giải quyết nó bằng cách xóa tất cả ký tự ascii không chuẩn trong văn bản của tôi (theo lời khuyên UTF-8 ở trên).

Tôi gặp vấn đề với hệ thống Debian 4, Java 5; nhưng cùng mã làm việc tốt với Ubuntu 9,04, Java 6. Cả hai chạy MySql 5.

4

Trong mysql bạn có thể sử dụng MEDIUMTEXT hay LONGTEXT loại lĩnh vực cho dữ liệu văn bản lớn

Các vấn đề liên quan