2013-05-22 27 views
5
mysql> SELECT LOCATE("n", "München") COLLATE utf8_general_ci; 
ERROR 1253 (42000): COLLATION 'utf8_general_ci' is not valid for CHARACTER SET 'binary' 

Làm cách nào để loại bỏ lỗi này?COLLATION 'utf8_general_ci' không hợp lệ đối với CHARACTER SET 'binary'?

Những gì tôi đã cố gắng (copy & dán):

$ mysql -u admin -p $DATABASE 
Enter password: 
Reading table information for completion of table and column names 
You can turn off this feature to get a quicker startup with -A 

Welcome to the MySQL monitor. Commands end with ; or \g. 
Your MySQL connection id is 2 
Server version: 5.1.69 Source distribution 

Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved. 

Oracle is a registered trademark of Oracle Corporation and/or its 
affiliates. Other names may be trademarks of their respective 
owners. 

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. 

mysql> SELECT LOCATE("n", "München") COLLATE utf8_general_ci; 
ERROR 1253 (42000): COLLATION 'utf8_general_ci' is not valid for CHARACTER SET 'binary' 
mysql> SET NAMES utf8; 
Query OK, 0 rows affected (0.00 sec) 

mysql> SELECT LOCATE("n", "München") COLLATE utf8_general_ci; 
ERROR 1253 (42000): COLLATION 'utf8_general_ci' is not valid for CHARACTER SET 'binary' 
mysql> SELECT LOCATE(_utf8"n", _utf8"München") COLLATE utf8_general_ci; 
ERROR 1253 (42000): COLLATION 'utf8_general_ci' is not valid for CHARACTER SET 'binary' 
mysql> SHOW VARIABLES LIKE "character_set_database"; 
+------------------------+-------+ 
| Variable_name   | Value | 
+------------------------+-------+ 
| character_set_database | utf8 | 
+------------------------+-------+ 
1 row in set (0.00 sec) 

Trả lời

2

Có thể máy chủ đã được biên soạn với một bộ ký tự mặc định của nhị phân, để xâu được giải thích như vậy, hoặc khách hàng được đặt để sử dụng chế độ nhị phân khi liên lạc với máy chủ. Bạn có thể thay đổi bộ ký tự máy khách và kết nối bằng cách gọi SET NAMES utf8 (mặc dù điều này không được khuyến nghị nếu các câu lệnh SQL của bạn đang được phát hành từ PHP, ví dụ như PHP sẽ có các lệnh riêng để thiết lập bộ ký tự kết nối). Xem Connection Character Sets and Collations trong sách hướng dẫn tham khảo MySQL.

Hoặc bạn có thể sử dụng "người giới thiệu" để xác định một cách rõ ràng charset sử dụng cho các literals chuỗi trong bạn VỊ chức năng, ví dụ:

LOCATE(_utf8"n", _utf8"München") 

Xem hướng dẫn tham khảo trang Character String Literal Character Set and Collation để biết thêm chi tiết.

+0

Bảng nào? Truy vấn của tôi không tham chiếu đến một bảng. – feklee

+0

Xin lỗi, một nửa ngủ ở đây. Tôi đã thay thế hoàn toàn câu trả lời. – Bobulous

+0

Trước khi đặt câu hỏi, tôi đã thử 'SET NAMES utf8', và bây giờ một lần nữa, không thành công. The * giới thiệu * trông giống như một giải pháp tốt đẹp, nhưng họ không làm việc: Thông báo lỗi vẫn tồn tại. Tôi đã thử: 'SELECT LOCATE (_utf8" n ", _utf8" München ") COLLATE utf8_general_ci' Bằng cách này, tôi đang trực tiếp sử dụng giao diện điều khiển, để chơi xung quanh. Tôi bắt đầu giao diện điều khiển với: 'mysql -u admin -p $ database' Tôi chỉ chạy' hiển thị các biến như "character_set_database" '.Kết quả: 'utf8' – feklee

2

Các COLLATE trong ví dụ của tôi sets the collation of the return value của LOCATE, kết quả trong số đó là loại binary.

Để thiết collation của các đối số:

mysql> SELECT LOCATE(_utf8"n" COLLATE utf8_general_ci, 
        _utf8"München" COLLATE utf8_general_ci) AS locate; 
+--------+ 
| locate | 
+--------+ 
|  3 | 
+--------+ 
1 row in set (0.00 sec) 

Động lực của tôi thực sự đã tìm hiểu xem liệu MySQL mất collation vào tài khoản khi tìm kiếm các chuỗi con. Thật không may là nó không. Xem kết quả của lệnh thứ hai:

mysql> SELECT LOCATE(_utf8"ü" COLLATE utf8_general_ci, 
        _utf8"München" COLLATE utf8_general_ci) AS locate; 
+--------+ 
| locate | 
+--------+ 
|  2 | 
+--------+ 
1 row in set (0.00 sec) 

mysql> SELECT LOCATE(_utf8"u" COLLATE utf8_general_ci, 
        _utf8"München" COLLATE utf8_general_ci) AS locate; 
+--------+ 
| locate | 
+--------+ 
|  0 | 
+--------+ 
1 row in set (0.00 sec) 

Thử nghiệm với một bảng tạm thời (đối chiếu xem xét trong WHERE khoản, nhưng không phải trong LOCATE):

mysql> CREATE TEMPORARY TABLE test 
     (text VARCHAR(100) CHARACTER SET utf8 COLLATE utf8_general_ci); 
Query OK, 0 rows affected (0.00 sec) 

mysql> INSERT INTO test VALUES("München"); 
Query OK, 1 row affected (0.00 sec) 

mysql> SELECT text FROM test WHERE text LIKE "%u%"; 
+---------+ 
| text | 
+---------+ 
| München | 
+---------+ 
1 row in set (0.00 sec) 

mysql> SELECT LOCATE("u", text) AS locate FROM test WHERE text LIKE "%u%"; 
+--------+ 
| locate | 
+--------+ 
|  0 | 
+--------+ 
1 row in set (0.01 sec) 
0

Tôi biết đây là muộn, nhưng Tôi hi vọng nó giúp ích cho ai đó. Tôi tiếp tục nhận được lỗi tương tự và tôi biết bộ ký tự và collations của tôi là tốt.

Kiểm tra ký hiệu '@' trong bảng sao kê không thuộc về. Tôi đã thử nghiệm thủ tục lưu trữ của tôi ra như là một tuyên bố chọn với các biến, sau đó khi tạo proc được lưu trữ quên để loại bỏ các ký hiệu '@'. Không cần phải nói, tôi cảm thấy rất ngớ ngẩn.

Tôi cũng biết đây không phải là trường hợp trong câu hỏi này nhưng đây là bài đăng đầu tiên của tôi và tôi không có đủ đại diện để làm nhiều việc khác, vì vậy tôi xin lỗi.

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