MYSQL,无法比较(等于)两个值
MYSQL, can't compare(equalize) two values
我觉得我的问题很奇怪。我正在尝试使用以下 sql 代码:
SELECT `name` FROM `table` WHERE `id` = 'roman' GROUP by `name`
它 returns 我是一个空值,我确信代码是正确的,因为它可以与其他 table 一起使用。我注意到,如果我转到 table,删除 id
值,然后再次手动输入它,它就可以正常工作(即使其余值看起来相同)。我的 table 是从 csv 文件导入的,但我确定行尾没有任何 spaces/letters/wrong 字符等(甚至用 HexEdit 进行了检查)。例如,如果我使用:
SELECT `name` FROM `table` WHERE `id` LIKE 'roman%' GROUP by `name`
然后它起作用了,所以看起来 id 值不知何故有问题。我也尝试过更改字符集。
最可能的解释是列中存储了不可打印的字符,可能是回车符 return、制表符或换行符。
要找出答案,请尝试获取存储值的十六进制表示和字节长度。
SELECT HEX('roman')
, LENGTH('roman')
, HEX(t.id)
, LENGTH(t.id)
FROM mytable t
WHERE t.id <> 'roman'
AND t.id LIKE 'roman%'
(可能正在进行字符集转换。上面的相同查询将揭示一些细节。)
存储的值末尾有一个回车return字符,十进制值为13。比较对象:
SELECT HEX('roman\r')
HEX('roman\r')
----------------
726F6D616E0D
^^
要从 id
列中删除所有出现的 return 字符(不仅仅是尾随字符),您可以使用 REPLACE
函数。
SELECT HEX(REPLACE('ro\rman\r','\r',''))
HEX(REPLACE('ro\rman\r','\r',''))
-----------------------------------
726F6D616E
在更新语句中,例如
UPDATE mytable SET id = REPLACE(id,'\r','')
如果 id
是 .csv 文件中的最后一个字段,则文件的行结束可能是 DOS 样式,带有回车符 return 和换行符;并且读取输入文件的过程仅剥离换行符,并将回车return作为数据的一部分。
这似乎是由 csv 导入引起的,最后一列中的所有值都有一个额外的换行符。我试过以下代码:
SELECT name
来自 table
WHERE id
LIKE 'roman_' GROUP by name
所以它将 "skip" 最后一个字符,但仍然不是 select 我的其他值,如: roman_string roman_string2 等。也许这不是最好的解决方案,但它是比花费大量时间重建 csv 导入脚本更好 :) 谢谢
我觉得我的问题很奇怪。我正在尝试使用以下 sql 代码:
SELECT `name` FROM `table` WHERE `id` = 'roman' GROUP by `name`
它 returns 我是一个空值,我确信代码是正确的,因为它可以与其他 table 一起使用。我注意到,如果我转到 table,删除 id
值,然后再次手动输入它,它就可以正常工作(即使其余值看起来相同)。我的 table 是从 csv 文件导入的,但我确定行尾没有任何 spaces/letters/wrong 字符等(甚至用 HexEdit 进行了检查)。例如,如果我使用:
SELECT `name` FROM `table` WHERE `id` LIKE 'roman%' GROUP by `name`
然后它起作用了,所以看起来 id 值不知何故有问题。我也尝试过更改字符集。
最可能的解释是列中存储了不可打印的字符,可能是回车符 return、制表符或换行符。
要找出答案,请尝试获取存储值的十六进制表示和字节长度。
SELECT HEX('roman')
, LENGTH('roman')
, HEX(t.id)
, LENGTH(t.id)
FROM mytable t
WHERE t.id <> 'roman'
AND t.id LIKE 'roman%'
(可能正在进行字符集转换。上面的相同查询将揭示一些细节。)
存储的值末尾有一个回车return字符,十进制值为13。比较对象:
SELECT HEX('roman\r')
HEX('roman\r')
----------------
726F6D616E0D
^^
要从 id
列中删除所有出现的 return 字符(不仅仅是尾随字符),您可以使用 REPLACE
函数。
SELECT HEX(REPLACE('ro\rman\r','\r',''))
HEX(REPLACE('ro\rman\r','\r',''))
-----------------------------------
726F6D616E
在更新语句中,例如
UPDATE mytable SET id = REPLACE(id,'\r','')
如果 id
是 .csv 文件中的最后一个字段,则文件的行结束可能是 DOS 样式,带有回车符 return 和换行符;并且读取输入文件的过程仅剥离换行符,并将回车return作为数据的一部分。
这似乎是由 csv 导入引起的,最后一列中的所有值都有一个额外的换行符。我试过以下代码:
SELECT name
来自 table
WHERE id
LIKE 'roman_' GROUP by name
所以它将 "skip" 最后一个字符,但仍然不是 select 我的其他值,如: roman_string roman_string2 等。也许这不是最好的解决方案,但它是比花费大量时间重建 csv 导入脚本更好 :) 谢谢