我正在尝试从电话表中选择记录,其中名为 Call_Rating 的 ENUM 字符串字段的值小于整数值 4。Call_Rating字段只能包含值“0”、“1”、“2”、“3”、“4”、“5”。每当我使用 CONVERT(Call_Rating, UNSIGNED INTEGER) 或 CAST(Call_Rating AS UNSIGNED) 时,Call_Rating 字段的值都会增加 1。为什么要这样做,除了从 CALL() 或 CAST() 函数中手动减去 1 之外,还有其他方法可以避免这种情况吗?
此外,这是一个由其他人设置的旧数据库,并且仍在被各种系统使用,因此在不更改数据库架构的情况下解决此问题的一些方法会很有用。
CREATE TABLE `member_calls` (
`CallID` int(10) NOT NULL AUTO_INCREMENT,
`Call_Rating` enum('0','1','2','3','4','5') CHARACTER SET latin1 NOT NULL DEFAULT '0',
PRIMARY KEY (`CallID`)
) ENGINE=MyISAM AUTO_INCREMENT=538616 DEFAULT CHARSET=utf8;
INSERT INTO `member_calls`
(`CallID`, `Call_Rating`)
VALUES
(510515, '4'),
(510909, '0'),
(538614, '3'),
(538615, '5');
SELECT `CallID`, `Call_Rating`, CAST(`Call_Rating` AS UNSIGNED) AS 'Casted', CONVERT(`Call_Rating`, UNSIGNED INTEGER) AS 'Converted'
FROM `member_calls`
WHERE CONVERT(`Call_Rating`, SIGNED INTEGER) < 4
OR CAST(`Call_Rating` AS UNSIGNED) < 4;
CallID Call_Rating Casted Converted
510909 0 1 1
CallID Call_Rating Casted Converted
510909 0 0 0
538614 3 3 3
谢谢大家的意见。我现在明白为什么会出现这个问题了。基本上,ENUM 被当作数组处理,CAST()/CONVERT() 返回数组的索引而不是值。对此的最佳解决方案是将 ENUM 更改为 INT 字段,但这在我的情况下是不可取的,因为数据库正在实时使用,并且更改数据类型可能会在其他地方引起问题。因此,lserni 的解决方案对我来说是最有用的。
最佳答案
ENUM 到 INTEGER 的直接转换产生该 ENUM 的索引,并且由于它们从 1 开始,因此第一个元素为 0 并变为 1,等等。
它根本没有增加 1:它返回一个整数值偶然看起来是正确值加 1。但它可以是任何其他东西。如果您有一个枚举“1”、“2”、“3”、“4”、“5”,但没有“0”,那么结果看起来是正确的,即使它真的不是。
要么运行从 CHAR 传递的双重转换,要么在转换为 CHAR 后再次运行隐式转换:
SELECT CONVERT(CONVERT(Call_Rating, CHAR(1)), UNSIGNED), 0+CONVERT(Call_Rating, CHAR(1)), 0+Call_Rating, CAST(Call_Rating AS UNSIGNED) from member_calls;
+--------------------------------------------------+---------------------------------+---------------+-------------------------------+
| CONVERT(CONVERT(Call_Rating, CHAR(1)), UNSIGNED) | 0+CONVERT(Call_Rating, CHAR(1)) | 0+Call_Rating | CAST(Call_Rating AS UNSIGNED) |
+--------------------------------------------------+---------------------------------+---------------+-------------------------------+
| 2 | 2 | 3 | 3 |
+--------------------------------------------------+---------------------------------+---------------+-------------------------------+
关于mysql CONVERT() 和 CAST() to integer 将值增加 1,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37280704/
这个问题在这里已经有了答案:Checktoseeifanarrayisalreadysorted?(8个答案)关闭9年前。我只是想知道是否有办法检查数组是否在增加?这是我的解决方案,但我正在寻找更漂亮的方法:n=-1@arr.flatten.each{|e|returnfalseife
我有一个页面,有时加载时间超过一分钟。假设这是预期的行为并且不会改变。在这些情况下,我得到Net::ReadTimeout。请注意,这是在通过单击上一页上的按钮导航到页面之后,而不是ajax请求。因此Capybara.using_wait_time没有帮助。我尝试了一些激进的方法(其中一些我知道行不通),例如:设置page.driver.browser.manage.timeouts的implicit_wait、script_timeout和page_load。遍历整个对象空间并设置所有Selenium::WebDriver::Remote::Http::Default的timeout
如果我尝试增加哈希中尚不存在的键的值,就像这样h=Hash.newh[:ferrets]+=1我收到以下错误:NoMethodError:undefinedmethod`+'fornil:NilClass这对我来说很有意义,而且我知道这一定是一个非常简单的问题,但我在SO上找不到它。如果我什至事先不知道我将拥有哪些key,我该如何添加和递增此类key? 最佳答案 可以在构造函数中设置hash的默认值h=Hash.new(0)h[:ferrets]+=1ph[:ferrets]请注意,设置默认值有一些缺陷,因此您必须谨慎使用。h=Ha
我正在使用rest-client发布到一个非常慢的网络服务。我将timeout设置为600秒,并且我已经确认它正在传递给Net::HTTP的@read_timeout和@open_timeout.但是,大约两分钟后,我收到一个低级超时错误,Errno::ETIMEDOUT:Connectiontimedout-connect(2):回溯的相关部分是Operationtimedout-connect(2)for[myhost]port[myport]/Users/dmoles/.rvm/rubies/ruby-2.2.5/lib/ruby/2.2.0/net/http.rb:879:in
我在从pggem中获取输入结果时遇到问题。require'pg'require_relative'spec/fixtures/database'client=PG.connect(DB[:pg])client.type_map_for_queries=PG::BasicTypeMapForQueries.new(client)client.type_map_for_results=PG::BasicTypeMapForResults.new(client)client.exec(%|select*fromtestme;|)do|query|query.each{|r|putsr.ins
我试图在URL中传递一个数组,它工作正常,但我想知道我如何才能插入或删除某些值?例如,我有一个看起来像这样的链接:http://localhost:3000/pins?genre_ids[]=1,2,3我想构建一组链接,可以从这个URL数组中插入或删除数字。目前,我拥有的每个链接都只是完全更改了genre_ids[]值,我想在其中添加或根据需要删除。这是我建立链接的代码...[genre[0].id]}))%>我认为我所追求的是params.merge()但对于params[:genre_ids]的值希望你能明白我的意思?如果当前URL读取/pins?genre_ids[]=1,2,3
我正在尝试测试需要将值存储在闪存中的操作。defmy_actionifflash[:something].nil?redirect_toroot_pathifflash[:something]returnend#Dosomeotherstuffend在我的测试中,我做了类似的事情:before(:each)doflash[:something]="bob"endit"shoulddowhateverIhadcommentedoutabove"doget:my_action#Assertsomethingend我遇到的问题是flash在my_action中没有值。我猜这是因为实际上没有请
这个问题在这里已经有了答案:Whydoesn'tRubysupporti++ori--(increment/decrementoperators)?(9个回答)关闭9年前。是什么导致了以下代码中的错误?ruby-e"puts1++"-e:1:syntaxerror,unexpected$end或ruby-e"x=1;putsx++;"-e:1:syntaxerror,unexpected';'
我如何在Ruby中简化它:x=(x||0)+1? 最佳答案 您可以使用to_i将nil转换为0x=x.to_i+1或者你可以使用succx=x.to_i.succ 关于Ruby:如何增加一个可能为零的数字?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/7440954/
在stackoverflow.com上发布一个堆栈溢出问题,多么有趣:-)我正在运行一些递归Ruby代码,我得到:“堆栈级别太深(SystemStackError)”(我很确定代码有效,我没有陷入无限递归的死亡螺旋,但这不是重点)是否可以更改我的Ruby应用程序允许的堆栈深度/大小?如果这是Ruby中的限制,我不太明白,因为错误显示“堆栈级别”,这给我的印象是Ruby以某种方式计算堆栈的“级别”,或者它只是意味着堆栈满了。我已经尝试在Vista和Ubuntu下运行这个程序,结果相同。在Ubuntu下,我尝试使用“ulimit-s”将堆栈大小从8192更改为16000,但这并没有改变任何