MySQL query - force case-sensitive with a ORDER BY rand( )

泪湿孤枕 提交于 2019-12-10 20:19:34

问题


Is it possible to force case-sensitive for a query?

Mine sounds like this:

"SELECT g_path FROM glyphs WHERE g_glyph = :g_glyph ORDER BY rand()"

if g_glyph = r, the result can be R or r and it's not what I expect. I'm looking for a case-sensitive return.

I googled my issue and I found this solution:

/*Case-sensitive sort in descending order.
In this query, ProductName is sorted in 
case-sensitive descending order.
*/
SELECT ProductID, ProductName, UnitsInStock
FROM products
ORDER BY BINARY ProductName DESC;

But the following line doesn't work at all:

"SELECT g_path FROM glyphs WHERE g_glyph = :g_glyph ORDER BY BINARY rand()"

Any Suggestion?

Thank you very much for your help.


回答1:


The order and equality of characters is defined by the collation. In most cases, a case-insensitive collation is used.

If you need to use a strict, case-sensitive comparison for a specific datum, use the BINARY operator:

mysql> SELECT 'a' = 'A';
        -> 1
mysql> SELECT BINARY 'a' = 'A';
        -> 0
mysql> SELECT 'a' = 'a ';
        -> 1
mysql> SELECT BINARY 'a' = 'a ';
        -> 0

So in your case:

SELECT g_path FROM glyphs WHERE BINARY g_glyph = :g_glyph ORDER BY rand()



回答2:


This is covered in the manual page Case Sensitivity in String Searches.

You need to specify a case sensitive or binary collation.

The default character set and collation are latin1 and latin1_swedish_ci, so nonbinary string comparisons are case insensitive by default. This means that if you search with col_name LIKE 'a%', you get all column values that start with A or a. To make this search case sensitive, make sure that one of the operands has a case sensitive or binary collation. For example, if you are comparing a column and a string that both have the latin1 character set, you can use the COLLATE operator to cause either operand to have the latin1_general_cs or latin1_bin collation:

col_name COLLATE latin1_general_cs LIKE 'a%'
col_name LIKE 'a%' COLLATE latin1_general_cs
col_name COLLATE latin1_bin LIKE 'a%'
col_name LIKE 'a%' COLLATE latin1_bin

If you want a column always to be treated in case-sensitive fashion, declare it with a case sensitive or binary collation. See Section 13.1.14, “CREATE TABLE Syntax”.

The _cs in the collation name stands for "case sensitive".



来源:https://stackoverflow.com/questions/10160556/mysql-query-force-case-sensitive-with-a-order-by-rand

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!