2012-04-02 60 views
9

Tôi muốn nhận được các nội dung từ một hàng trong cơ sở dữ liệu và so sánh các phiên bản chữ thường của nó vào một phiên bản chữ thường của một imput sử dụng để kiểm tra xem nó tồn tại trong cơ sở dữ liệu:MySQL chữ thường để so sánh dữ liệu

"SELECT `id` FROM `user_accounts` WHERE `username` = '".strtolower($username)."'" 

Làm thế nào tôi có thể lấy tên người dùng là chữ thường từ mysql?

+2

'LOWER (tên người dùng)' Xem lại [chức năng chuỗi MySQL] (http://dev.mysql.com/doc/refman/5.0/en/string-functions.html) –

Trả lời

8

Nếu bạn thực sự muốn không quan trọng thì bạn nên thiết lập collation của cột là case-insensitive.

mysql> SET NAMES 'utf8' COLLATE 'utf8_unicode_ci'; 
Query OK, 0 rows affected (0.03 sec) 

mysql> SELECT 'foobar' = 'FoObAr'; 
+---------------------+ 
| 'foobar' = 'FoObAr' | 
+---------------------+ 
|     1 | 
+---------------------+ 
1 row in set (0.01 sec) 

mysql> SELECT 'fOoBaR' = 'FoObAr'; 
+---------------------+ 
| 'fOoBaR' = 'FoObAr' | 
+---------------------+ 
|     1 | 
+---------------------+ 
1 row in set (0.00 sec) 

mysql> SELECT 'fOoBaR' = 'FoObAz'; 
+---------------------+ 
| 'fOoBaR' = 'FoObAz' | 
+---------------------+ 
|     0 | 
+---------------------+ 
1 row in set (0.00 sec) 
+0

Tôi nghĩ rằng cài đặt mặc định của mysql bằng cách sử dụng myisam đã là trường hợp không nhạy cảm – iWantSimpleLife

+1

@ iWantSimpleLife: Bạn có đề xuất chúng tôi giả định rằng người hỏi có cùng cấu hình mà bạn đã xem không? Và điều gì sẽ xảy ra nếu họ chuyển sang một hệ thống khác đã thay đổi mặc định? –

+0

Điều đó không đúng vì có thể ảnh hưởng đến các lần chèn trong tương lai, '' 'lower (' username') '' 'là câu trả lời đúng –

-1
"SELECT `id` FROM `user_accounts` WHERE lower(`username`) = '".strtolower($username)."'" 
+0

Có cùng câu trả lời –

2
$query = "SELECT `id` 
      FROM `user_accounts` 
      WHERE LOWER(`username`) = '".strtolower($username)."'" 
1

Bạn có thể sử dụng truy vấn sau đây để làm như vậy:

$myquery = "SELECT `id` FROM `user_accounts` WHERE 
      LOWER(`username`) = '".strtolower($username)."'" 

LOWER là hàm SQL có thể chuyển đổi tất cả các ký tự chữ thường, giống như PHP strtolower

Trên lưu ý phụ: Bạn nên thoát khỏi $username bằng cách sử dụng mysql_real_escape_string để tránh tiêm sql có thể tại thời điểm đó.

1

Như đã trả lời ở trên, Lý tưởng nhất là nên làm việc này,

$query = "SELECT `id` 
      FROM `user_accounts` 
      WHERE LOWER(`username`) = '".strtolower($username)."'"; 

nhưng nó sẽ không hoạt động nếu "username" cột trong "user_accounts" bảng được định nghĩa là VARBINARY. Lý do là VARBINARY yêu cầu dữ liệu phải phân biệt chữ hoa chữ thường

2

Sử dụng một trong các truy vấn trên sẽ chỉ hoạt động tốt nhưng THẬN TRỌNG! Nếu bạn có cột tên người dùng của bạn được lập chỉ mục, sử dụng LOWER trên nó sẽ làm cho nó để truy vấn của bạn không sử dụng chỉ mục đó.

0

Đơn giản chỉ cần sử dụng:

SELECT `id` 
FROM `user_accounts` 
WHERE LOWER(`username`)='".strtolower($username)."'"; 

Hoặc Sử dụng

SELECT `id` 
FROM `user_accounts` 
WHERE LCASE(`username`)='".strtolower($username)."'"; 

Cả hai sẽ làm việc như nhau.

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