MySQL查询 - 使用ORDER BY rand强制区分大小写()

时间:2012-04-15 08:24:23

标签: mysql case-sensitive

是否可以对查询强制区分大小写?

我听起来像这样:

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

如果g_glyph = r,结果可以是R或r而且它不是我所期望的。 我正在寻找一个区分大小写的回报。

我搜索了我的问题,我找到了这个解决方案:

/*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;

但以下行根本不起作用:

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

有任何建议吗?

非常感谢你的帮助。

2 个答案:

答案 0 :(得分:5)

字符的顺序和相等性由collation定义。在大多数情况下,使用不区分大小写的排序规则。

如果您需要对特定数据使用严格的区分大小写的比较,请使用BINARY operator

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

所以在你的情况下:

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

答案 1 :(得分:2)

手册页Case Sensitivity in String Searches中介绍了这一点。

您需要指定区分大小写或二进制排序规则。

  

默认字符集和排序规则是latin1和latin1_swedish_ci,因此非二进制字符串比较默认情况下不区分大小写。这意味着如果使用col_name LIKE'a%'进行搜索,则会获得以A或a开头的所有列值。要使此搜索区分大小写,请确保其中一个操作数具有区分大小写或二进制排序规则。例如,如果要比较具有latin1字符集的列和字符串,则可以使用COLLATE运算符使任一操作数具有latin1_general_cs或latin1_bin排序规则:

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
     

如果希望始终以区分大小写的方式处理列,请使用区分大小写或二进制排序规则来声明它。请参见第13.1.14节“CREATE TABLE语法”。

排序规则名称中的_cs代表“区分大小写”。