选择中UPPER的奇怪行为

时间:2013-05-03 10:03:21

标签: mysql uppercase

我试图在MySQL选择中操作一些字符串,我似乎从UPPER函数中有一些奇怪的行为。

我正在尝试返回单词的第一个字母(用空格分隔)并将其转换为大写。但是如果我在单个返回的字母上使用UPPER,我会得到一个空白,而如果我在获得第一个字母之前使用整个单词上的UPPER,我会得到第一个字母。

将SQL解析到最低限度我已经提出了这个测试SQL: -

SELECT 
    'verbatim h', 
    SUBSTRING(SUBSTRING_INDEX(SUBSTRING_INDEX(CONCAT(' ','verbatim h',' '), ' ', 2), ' ', -1), 1, 1),
    UPPER(SUBSTRING(SUBSTRING_INDEX(SUBSTRING_INDEX(CONCAT(' ','verbatim h',' '), ' ', 2), ' ', -1), 1, 1)),
    SUBSTRING(UPPER(SUBSTRING_INDEX(SUBSTRING_INDEX(CONCAT(' ','verbatim h',' '), ' ', 2), ' ', -1)), 1, 1)

这是字符串'verbatim h',在两端连接空格,然后在第一和第二空格之间获取字符串(因此它将获得 verbatim )。

第一列是完整字符串,第二列是第一个单词的第一个字母,第三列是第一个字母转换为第一个单词的大写,而第四个列是第一个单词的第一个字母转换为大写。

我认为第3列和第4列应该具有相同的值(唯一的区别是在抓取第一个字母之前将第一个单词转换为大写字母,而另一个字母抓住第一个字母然后将其转换为大写字母),但是相反,一个包含字母 V ,正如我所期望的那样,而另一个包含空白。

如果我修改上面的内容以获得结果字符的十六进制值,则空白字符串是十六进制值为00的1字符字符串,而V是十六进制值为56.

有什么建议吗?我错过了一些明显的东西吗?

1 个答案:

答案 0 :(得分:1)

该字符串成为二进制字符串。对于这些,您无法使用LOWERUPPER,如mysql reference docu

中所述

那么如何解决?

使用convert这样的功能:

SELECT 
    'verbatim h', 
    SUBSTRING(SUBSTRING_INDEX(SUBSTRING_INDEX(CONCAT(' ','verbatim h',' '), ' ', 2), ' ', -1), 1, 1) AS c1,
    UPPER(CONVERT((SUBSTRING(SUBSTRING_INDEX(SUBSTRING_INDEX(CONCAT(' ','verbatim h',' '), ' ', 2), ' ', -1), 1, 1)) USING latin1)) AS c1_upper;

这是一个sqlfiddle