2016-06-16 12 views
13

Tôi đang cố gắng chọn tất cả các chuỗi trong cơ sở dữ liệu của mình bắt đầu bằng chữ thường với regexp, nhưng vì một số lý do, nó chọn tất cả các chuỗi bắt đầu bằng chữ cái hoa . Tôi đang làm gì sai?Chọn tất cả các chuỗi từ cơ sở dữ liệu bắt đầu bằng một chữ thường

SELECT * 
FROM `allData` 
WHERE response REGEXP '^[a-z]' 
LIMIT 0 , 30 
+3

Theo [docs] (http://dev.mysql.com/doc/refman/5.7/en/regexp.html): 'REGEXP không phân biệt chữ hoa chữ thường, trừ khi được sử dụng với chuỗi nhị phân. ' –

Trả lời

11

Từ MySQL REGEXP manual:

REGEXP không trường hợp nhạy cảm, trừ khi được sử dụng với chuỗi nhị phân.

Bạn thể do đó có một số may mắn khi sử dụng một chuỗi nhị phân thay vì:

WHERE response REGEXP BINARY '^[a-z]' 

fiddle phải chăng ngớ ngẩn cho cuộc biểu tình: http://sqlfiddle.com/#!9/7eade/3

EDIT: Như Ray nói trong các ý kiến, bạn nên có thể sử dụng [[:lower:]] để làm việc trên tất cả các collations, ví dụ

WHERE response REGEXP BINARY '^[[:lower:]]' 
+0

Cảm ơn. Điều này hoạt động hoàn hảo. – frosty

+0

Nếu điều này làm việc cho bạn, vui lòng đánh dấu là được chấp nhận khi bạn có thể :) – slugonamission

+0

Bạn không nghĩ '[[: lower:]]' là tổng quát hơn '[a-z]' trên các bộ ký tự và collations? – Ray

1
SELECT * 
FROM allData 
WHERE LOWER(LEFT(response, 1)) <> LEFT(response, 1) 
LIMIT 0 , 30 

... Tuy nhiên, điều này có thể bị giới hạn bởi bạn MySQL character collation

2

Tôi sẽ sử dụng nhân vật mysql của Class Name để phù hợp kết hợp với REGEXP BINARY:

WHERE response REGEXP BINARY '^[[:lower:]]' 

I don' t biết nếu [a-z] có ý nghĩa trong mọi bộ ký tự và đối chiếu, khi tên lớp nhân vật [:lower:] sẽ luôn khớp với tất cả er ký tự chữ hoa chữ thường.

0
select * from alldata where lower(left(response,1)) COLLATE Latin1_General_CS_AS =left(response,1) and response is not null and response<>'' 
Các vấn đề liên quan