mysql char只显示第一个字符

时间:2016-09-22 08:33:47

标签: mysql select char ascii

我的MYSQL表中有这个值"&#84&#101&#115&#116" (=="试验&#34) 这个文本基本上是十进制格式。 更多信息:https://en.wikipedia.org/wiki/T#Computing_codes 我正在尝试将选择查询作为常规文本运行。 这些是我正在运行的测试:

1。 查询: 从id = 1的表中选择TRIM(领先',' FROM替换(修剪(名称),"&#",",")) ;

输出: 84101115116

2。 查询: 选择char(84,101,115,116);

输出:测试

3。 查询: 从表中选择字符(TRIM(领先',' FROM替换(修剪(名称),"&#",","))) id = 1;

输出:T

我怎样才能得到整个单词而不只是第一个字符?

谢谢,

尼尔。

2 个答案:

答案 0 :(得分:0)

你没有得到预期的结果,因为

TRIM(Leading ',' FROM replace(trim(name),"&#",",")) 

返回字符串而不是数组

'84,101,115,116'

然后 char()只解释第一组可读的数字。

如果您想继续,请查看使用procedures提出的类似问题。

您应该创建一个将字符串小数作为表结果集返回的过程,然后将其用作 CHAR()的输入。这样你就可以将复杂的逻辑移到程序中,然后像这样使用它(未经测试):

select
    GROUP_CONCAT(
        SELECT
            char(*)
        FROM
            (
                CALL database.getDecimalText()
            )
    ) SEPARATOR '' )
from
    table
    where
        id = 1;

答案 1 :(得分:0)

正如Mulcek所说,你传递的看起来像是逗号分隔的CHAR函数的参数,但实际上这是一个包含逗号的单个字符串。 MySQL将其解释为此并返回它识别的已解码的第一个数字。

一步解决方案是使用预准备语句将整个查询构建为字符串,然后按如下方式执行:

SET @VTestVar = '&#84&#101&#115&#116';
SET @VExec = CONCAT('SELECT CHAR(', (SELECT TRIM(Leading ',' FROM REPLACE(TRIM(@VTestVar),"&#",","))), ') value;');

PREPARE stmt FROM @VExec;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

此处根据您的使用情况进行了调整:

SET @VTestVar = '&#84&#101&#115&#116';
SET @VExec = CONCAT('SELECT CHAR(', (SELECT TRIM(Leading ',' FROM REPLACE(TRIM(select TRIM(Leading ',' FROM replace(trim(name),"&#",",")) from table where id = 1),"&#",","))), ') value;');

PREPARE stmt FROM @VExec;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

此致

詹姆斯