Hãy giúp tôi hiểu các ký tự đa byte như biểu tượng cảm xúc được xử lý trong các trường MySQL utf8mb4 như thế nào.Tôi làm cách nào để tìm kiếm bằng biểu tượng cảm xúc trong MySQL bằng utf8mb4?
Xem bên dưới để biết SQL thử nghiệm đơn giản để minh họa các thách thức.
/* Clear Previous Test */
DROP TABLE IF EXISTS `emoji_test`;
DROP TABLE IF EXISTS `emoji_test_with_unique_key`;
/* Build Schema */
CREATE TABLE `emoji_test` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`string` varchar(191) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '',
`status` tinyint(1) NOT NULL DEFAULT '1',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE TABLE `emoji_test_with_unique_key` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`string` varchar(191) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '',
`status` tinyint(1) NOT NULL DEFAULT '1',
PRIMARY KEY (`id`),
UNIQUE KEY `idx_string_status` (`string`,`status`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
/* INSERT data */
# Expected Result is successful insert for each of these.
# However some fail. See comments.
INSERT INTO emoji_test (`string`, `status`) VALUES ('', 1); # SUCCESS
INSERT INTO emoji_test (`string`, `status`) VALUES ('', 1); # SUCCESS
INSERT INTO emoji_test (`string`, `status`) VALUES ('', 1); # SUCCESS
INSERT INTO emoji_test (`string`, `status`) VALUES ('', 1); # SUCCESS
INSERT INTO emoji_test_with_unique_key (`string`, `status`) VALUES ('', 1); # SUCCESS
INSERT INTO emoji_test_with_unique_key (`string`, `status`) VALUES ('', 1); # FAIL: Duplicate entry '?-1' for key 'idx_string_status'
INSERT INTO emoji_test_with_unique_key (`string`, `status`) VALUES ('', 1); # SUCCESS
INSERT INTO emoji_test_with_unique_key (`string`, `status`) VALUES ('', 1); # FAIL: Duplicate entry '??-1' for key 'idx_string_status'
/* Test data */
/* Simple Table */
SELECT * FROM emoji_test WHERE `string` IN ('','','',''); # SUCCESS (all 4 are found)
SELECT * FROM emoji_test WHERE `string` IN (''); # FAIL: Returns both and
SELECT * FROM emoji_test WHERE `string` IN (''); # FAIL: Returns both and
SELECT * FROM emoji_test; # SUCCESS (all 4 are found)
/* Table with Unique Key */
SELECT * FROM emoji_test_with_unique_key WHERE `string` IN ('','','',''); # FAIL: Only 2 are found (due to insert errors above)
SELECT * FROM emoji_test_with_unique_key WHERE `string` IN (''); # SUCCESS
SELECT * FROM emoji_test_with_unique_key WHERE `string` IN (''); # FAIL: found instead of
SELECT * FROM emoji_test_with_unique_key; # FAIL: Only 2 records found (and)
Tôi quan tâm đến việc học những gì gây ra FAIL
s trên và làm thế nào tôi có thể làm được việc này.
Cụ thể:
- Tại sao Selects cho một multibyte kết quả nhân vật để đổi lấy bất kỳ ký tự multibyte?
- Tôi làm cách nào để định cấu hình chỉ mục để xử lý các ký tự nhiều byte thay vì
?
? - Bạn có thể đề xuất các thay đổi cho số
CREATE TABLE
thứ hai (khóa có khóa duy nhất) ở trên theo cách làm cho tất cả các truy vấn kiểm tra trở lại thành công không?
Như bất kỳ người Mexico có thể cho bạn biết, ([ 'TACO' (U + 1F32E)] (http://www.fileformat.info/info/unicode/char/1f32e/index.htm)) và ([ 'HOT PEPPER '(U + 1F336)] (http://www.fileformat.info/info/unicode/char/1f336/index.htm)) có liên quan rõ ràng nhưng khác nhau. Đây phải là câu hỏi được sáng tác tuyệt vời nhất trong nhiều năm. –
liên quan: http://stackoverflow.com/questions/38116984/finding-values-case-insensitively-with-emojis: * Giải pháp là sử dụng MySQL 5.6+ và sử dụng utf8mb4_unicode_520_ci chiếu mà không đối xử với tất cả 4 ký tự byte như bình đẳng * - một lý do khá tốt để tránh biểu tượng cảm xúc như mật khẩu :) –
@ ÁlvaroGonzález Vâng, nếu đây là một vấn đề đối với mật khẩu, sau đó có một vấn đề lớn hơn lớn hơn với các thiết lập nhất định, vì các mật khẩu được lưu trữ với một hash oneway. Và vì băm, nó không phải là một vấn đề. Nhưng tôi cũng sẽ không gợi ý sử dụng chúng cho mật khẩu. –