Data Truncation: Truncated Incorrect DOUBLE Value When Updating Timestamp

Posted February 18, 2009 at 3:04 PM

Tags: ColdFusion, SQL

I just spent the last hour trying to debug the smallest SQL problem! I have a datatable of Contracts and I was building a feature in our client software where we could end all contracts of a certain type (SLA) at the same time (trust me, there is a business reason behind this). To do this, I was executing the following MySQL Cross-Table UPDATE statement:

 Launch code in new window » Download code as text file »

  • UPDATE
  • contract c
  • INNER JOIN
  • contract_type t
  • ON
  • (
  • t.reference_key = 'SLA'
  • AND
  • c.contract_type_id = t.id
  • )
  • SET
  • c.date_updated = <cfqueryparam value="#Now()#" cfsqltype="cf_sql_timestamp" />
  • AND
  • c.date_ended = <cfqueryparam value="#Now()#" cfsqltype="cf_sql_timestamp" />
  • WHERE
  • c.date_ended IS NULL

I'm trying to set the date_ended field to Now() where ever it is currently NULL and of the correct contract type (SLA). However, when I ran this query, MySQL kept throwing this error:

Data truncation: Truncated incorrect DOUBLE value: '2009-02-18 13:43:35'

The error certainly wants you to believe that this is a data problem. Specifically, the error wants you to believe that the date/time value you are using in the query is somehow being converted to a double and that the converted value is too big for a double. So naturally, that's what I was trying to debug. But, after a solid hour, no joke, I came to realize that this error has nothing to do with data at all and is, in fact, a syntax error!

Look at my SET statement:

 Launch code in new window » Download code as text file »

  • SET
  • c.date_updated = <cfqueryparam value="#Now()#" cfsqltype="cf_sql_timestamp" />
  • AND
  • c.date_ended = <cfqueryparam value="#Now()#" cfsqltype="cf_sql_timestamp" />

See the problem now? I have it written out like a WHERE statement; a proper SET statement uses commas, not ANDs. Rewritten properly, the query is:

 Launch code in new window » Download code as text file »

  • UPDATE
  • contract c
  • INNER JOIN
  • contract_type t
  • ON
  • (
  • t.reference_key = 'SLA'
  • AND
  • c.contract_type_id = t.id
  • )
  • SET
  • c.date_updated = <cfqueryparam value="#Now()#" cfsqltype="cf_sql_timestamp" />,
  • c.date_ended = <cfqueryparam value="#Now()#" cfsqltype="cf_sql_timestamp" />
  • WHERE
  • c.date_ended IS NULL

So yeah, that's an hour of my life I won't get back. That's a really poor error that MySQL is throwing. Not that I'm blaming MySQL - I was the one who wrote the crappy statement - but, it did sort of lead me on a wild goose chase. Next time, thought, I'll be prepared!

Download Code Snippet ZIP File

Post Comment  |  Ask Ben  |  Other Searches  |  Print Page



Learning ColdFusion 9 - ColdFusion 9 tutorials, samples, examples, demos

Reader Comments

Feb 18, 2009 at 3:20 PM // reply »
40 Comments

Good thing that you have your own company. If you worked for someone they might have ripped you for "wasting" an hour.

Those bugs are so much fun.


Feb 18, 2009 at 3:44 PM // reply »
7,572 Comments

@Brandon,

Hey, I was still doing client work :)


Feb 18, 2009 at 9:59 PM // reply »
28 Comments

Just curious. Why did you write out:
c.date_ended = <cfqueryparam value="#Now()#" cfsqltype="cf_sql_timestamp" />
When MySQL has a built in "now()" function. Would it be cleaner (and a mirco-fraction faster) if you did this:
c.date_ended = now()

I imagine you have your reasons.
(Like:
To keep the SQL cross DB compliant
DB server isn't in same timezone as Webserver
)


Feb 19, 2009 at 7:55 AM // reply »
7,572 Comments

@Tim,

I just use it out of habit. I like to keep the SQL as consistent as possible and so I use CFQueryParam for ally my dynamic value. Plus, sometimes I have dates that have to be null based on other values and CFQueryParam makes that wicked easy:

<cfqueryparam value="#FORM.date_started#" type="cf_sql_timestamp" null="#(NOT IsDate( FORM.date_started ))#" />

With this, I can put my null-ify logic right into the CFQueryParam tag and keep my SQL free of CFIF statements regarding NULL inserts.


Mar 19, 2009 at 9:52 PM // reply »
1 Comments

WOW. I just did the same thing! I actually spent a couple hours trying to figure this out :(


Mar 23, 2009 at 8:31 AM // reply »
7,572 Comments

@Chuck,

Yeah, the error message is SOOOO misleading!


May 13, 2009 at 1:41 AM // reply »
1 Comments

Whahaha. You just saved me an hour ;)


May 13, 2009 at 7:23 AM // reply »
7,572 Comments

@Jrgns,

No problem my man :) It's a horribly unhelpful error message, so glad to help.


Jun 1, 2009 at 5:19 AM // reply »
1 Comments

GOD!

same mistake here.

the error message REALLY HELPED(in making debugging more complex I mean:P)


Jun 7, 2009 at 10:40 AM // reply »
1 Comments

Thanks for that one Ben :)


Jul 1, 2009 at 3:11 PM // reply »
1 Comments

Wow, you just saved me an hour. Thanks.


Jul 27, 2009 at 3:37 AM // reply »
1 Comments

Thanks man, saved me an hour for sure...will remember this one for a long time.


Aug 21, 2009 at 3:17 AM // reply »
1 Comments

Thanks very much!Actually you saved me an hour.and thanks you one hour.


Sep 6, 2009 at 1:38 PM // reply »
7,572 Comments

Glad to help out guys.


Nov 9, 2009 at 11:30 AM // reply »
1 Comments

Just saved me a morning of frustration too!

Thanks!


Feb 16, 2010 at 11:52 AM // reply »
2 Comments

MySQL raised same crappy error on the following syntax:

select IFNULL(id,0)+1 into nextval from nextids where UPPER(tablename)=UPPER('''' + tbname + '''')

The correct syntax should be:

select IFNULL(id,0)+1 into nextval from nextids where UPPER(tablename)=UPPER(CONCAT('''',tbname,''''));

Thank you,Ben. It is your post that enlightened me to stop searching for errors in places where there aren't chances to find one :))


Feb 17, 2010 at 10:16 PM // reply »
7,572 Comments

@Lucian,

Going from MS SQL to MySQL, it took me a while to get in the mindset of CONCAT(). In MS SQL, using the "+" is so easy.


Feb 18, 2010 at 4:36 PM // reply »
1 Comments

You wasted an hour of your life but saved me one - thanks for posting this!


Feb 18, 2010 at 4:55 PM // reply »
2 Comments

@Ben

Yes, Ben, couldn't they just have used that tiny "+" sign? :))

Oh, another thing!
After using the concat, i kept receiving this error: "No data fetched and-some-other-thing-bla-bla" Said to myself: "Bugger! What could be wrong this time?"

Well, since I am a Delphi developer, at my origins, i always add the quotes when comparing a constant-value string to a variable string/a string-type parameter.
Well (again), it seems that MySQL doesn't need the quotes, it has it's own. Very ashamed of not knowing this, stop "boo"-ing me.

So, finally, the winning syntax was:

select IFNULL(id,0)+1 into nextval from nextids where UPPER(tablename)=UPPER(tbname)

It was right there, in front of me, all the time :)

Nice night to you, Ben, and thanks again.

Lucian


Feb 22, 2010 at 9:09 PM // reply »
7,572 Comments

@Lucian,

Sometimes, error just seem to do more harm than good :) They almost act as misdirection.


Mar 5, 2010 at 10:50 AM // reply »
1 Comments

Saved me the hour! Thanks!


Mar 8, 2010 at 7:10 PM // reply »
7,572 Comments

@JGreen,

My pleasure!


Post Comment  |  Ask Ben

Recent Blog Comments
Mar 21, 2010 at 8:57 PM
The Bourne Ultimatum Starring Matt Damon And Julia Stiles
late to the party, but my observation is this: rewatch carefully for the platonic nature of the relationship between nicki and jason. she never flirts with him. he never comes on to her. they alway ... read »
Mar 21, 2010 at 7:40 PM
Is Simulating User-Input Events With jQuery Ever A Good Idea?
A couple of things. One you embed the initial state of of more-info in the CSS. IMHO, that behavior should be in jQuery: moreInfo.hide(); It shows that the behavior your toggling and closing is mor ... read »
Mar 21, 2010 at 3:59 PM
Exploring ColdFusion Component Runtime Class Properties And Serialization
@Elliott, according to Ben's experiment, serializeJSON() doesn't access the private data by default - it doesn't even access the getHair() method - so trying to clone a Girl.cfc via serializeJSON/des ... read »
Mar 21, 2010 at 3:49 PM
Ask Ben: Javascript String Replace Method
I'm confused a bit by what you are asking, but if had this sentence: The color, red, is in the style statement; style: red;. and wanted to remove all or change all of the commas, colons, and semi-c ... read »
Mar 21, 2010 at 3:13 PM
Ask Ben: Javascript String Replace Method
I am trying to make a java program to count the number of times that these punctuation marks occur in a body of text: , : ; . ! - ' " ? / \ I am using this piece to ferret out the commas: numcommas ... read »
Mar 21, 2010 at 11:13 AM
A New Wrist Pain
@chiropractor suwanee, Spoken like someone trying to sell something. Other than for minor, temporary relief from some back pain, chiropractic treatment is nothing but placebo effect and quackery. ... read »
Mar 21, 2010 at 6:32 AM
ColdFusion CFPOP - My First Look
Apologies... The field name in the db for C. is "BounceCode" It stores the code / message which is returned in the email. Sorry for the confusion. ... read »
Mar 21, 2010 at 6:29 AM
ColdFusion CFPOP - My First Look
@Jose Galdamez, Hi Ben and Jose 1st of all.. big thanks to Jose for his Skype chat a few weeks back. Your time was much appreciated. I have come up with a rather unelegant solution to my problem a ... read »