我试图在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.
有什么建议吗?我错过了一些明显的东西吗?
答案 0 :(得分:1)
该字符串成为二进制字符串。对于这些,您无法使用LOWER
和UPPER
,如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