2012-06-12 8 views
5

Tôi biết có rất nhiều câu hỏi tương tự về SF, nhưng tôi nghĩ rằng tôi là đủ khác nhau để đảm bảo một câu hỏi mới. Tôi có một bảng có một cột duy nhất là utf8 với utf8_unicode_ci. Nó cũng có một khóa duy nhất trên cột này cùng với một cột khác đánh dấu một mã ngôn ngữ. Dữ liệu trong cột nằm trong nhiều tập lệnh khác nhau (tiếng Latinh với nhiều dấu khác nhau, tiếng Trung và tiếng Nga, trong số các phần tử khác).Trường hợp MySQL không nhạy cảm nhưng Accent nhạy cảm UTF8 Khóa duy nhất

Vấn đề là đôi khi tôi muốn nhập vào hai từ với các ý nghĩa khác nhau chỉ khác nhau bằng dấu phụ (tức là ano Tây Ban Nha vs año). Vì utf8_unicode_ci là cả hai trường hợp và giọng không nhạy cảm, nó nghĩ rằng đây là như nhau và sẽ chỉ cho phép tôi nhập một. Điều đó thật tệ. Lý tưởng nhất, tôi chỉ cần chuyển toàn bộ cột sang một số collation đó là trường hợp không nhạy cảm nhưng giọng nhạy cảm, nhưng điều đó dường như không tồn tại. Rất nhiều công cụ khác nhau sử dụng cột này, vì vậy tôi không muốn thay đổi collation mặc định của cột thành utf8_bin vì sợ các công cụ lộn xộn với độ nhạy của trường hợp. Vì vậy, tất cả điều đó nói rằng, tôi cần một số giải pháp sẽ không ảnh hưởng đến độ nhạy trường hợp mặc định trong nhiều truy vấn hiện có đã nhấn cột này, nhưng sẽ cho phép tôi thêm vào các từ khác nhau chỉ bằng dấu phụ. Ý tưởng? Tôi sẽ chỉ chuyển đổi ràng buộc khóa duy nhất thành utf8_bin nếu tôi có, nhưng tôi không muốn vì tôi không bao giờ muốn hai thứ trong bảng chỉ khác nhau theo từng trường hợp.

Trả lời

0

Điều duy nhất tôi có thể nghĩ đến (mà không tìm thấy một đối chiếu phù hợp với nhu cầu của bạn) là thay đổi một cái gì đó ở lớp ứng dụng (bên ngoài MySQL) sẽ xử lý sự khác biệt.

Ví dụ, vì bạn không quan tâm đến trường hợp, bạn có thể làm điều gì đó theo chương trình để giảm trường hợp của tất cả các hàng trong cơ sở dữ liệu. Sau đó thay đổi collation thành utf8_bin.

Sau đó, bạn có thể, trong ứng dụng, chuyển đổi mọi thứ thành chữ thường trước khi nhập cơ sở dữ liệu (tôi đoán điều này sẽ không ảnh hưởng đến các ký tự dấu phụ). Bằng cách đó, bạn sẽ vẫn gặp lỗi nếu mọi người cố gắng nhập nhiều trường hợp, bạn chỉ phải thay đổi một vài dòng mã để điều kiện tiên quyết vào bảng và bạn sẽ không gặp vấn đề về dấu phụ.

+1

Một số ký tự viết hoa không có chữ thường. Một số có nhiều chữ thường. Đó là một mớ hỗn độn. –

0

Bạn không cần phải tái tạo lại lốp phẳng (phát minh lại bánh xe) tại đây.

Có hai collations tiếng Tây Ban Nha trong MySQL:

utf8_spanish_ci (Tây Ban Nha hiện đại) và utf8_spanish2_ci (truyền thống Tây Ban Nha)

Những biết ngôn ngữ cũng đủ để biết rằng N và n nên được đối chiếu lại với nhau , nhưng rằng Ñ và ñ là các chữ cái khác nhau giữa N và O. Trong tiếng Tây Ban Nha, chữ Ñ thực ra là một chữ cái khác, không phải là dấu.

Đặt đối chiếu cột của bạn thành utf8_spanish_ci và tất cả sẽ hoạt động theo cách bạn muốn.

+0

Cảm ơn, nhưng như tôi đã đề cập, đó không chỉ là tiếng Tây Ban Nha mà tôi lo lắng. Có nhiều thứ trong nhiều ngôn ngữ khác nhau. – Eli

+0

Hmm. Những người đã mơ ước về sự đối chiếu Unicode là những nhà ngôn ngữ học xuất sắc. Nếu có một giải pháp phổ quát đã làm điều đúng cho tất cả các ngôn ngữ chữ cái La Mã, họ sẽ thực hiện nó. Bạn có thể cần thực hiện một số truy vấn nhạy cảm về ngôn ngữ, dựa trên ngôn ngữ của người dùng của bạn. Bạn có thể đặt một mệnh đề COLLATE trong câu lệnh WHERE. –