[MySQL] integer / string probleem met LPAD()

Pagina: 1
Acties:

  • marty
  • Registratie: Augustus 2002
  • Laatst online: 27-03-2023
Ik ben weer eens tegen een bug, of op z'n minst raar gedrag in mysql opgelopen.

Ik heb een veld met alleen getallen waarbij ik bij de output (wat mysql uitpoept) 1 op wil tellen en een voorloop 0 wil toevoegen als het getal minder dan 4 cijfers bevat.
dit met een taal als php oplossen is geen optie, het moet binnen mysql gebeuren

Dus
123 => 0124
1234 => 1235

het optellen gaat goed (het veld is van het type MEDIUMINT), maar de voorloop nul gaat fout. MySQL kent niet iets van sprintf() voor zover ik weet, dus heb het geprobeerd met LPAD.
Die functie weigert het alleen om met integers aan de slag te gaan. Ik krijg daardoor steevast 0000 terug. En mijn pogingen de integer naar een string te converteren mislukken ook. Alle functies die een string horen terug te geven bieden geen uitkomst. Heb bijvoorbeeld geprobeerd met CONCAT() niets er aan te plakken, 2x REVERSE(), etc.; het biedt allemaal geen oplossing.

De enige oplossing die ik zie is met een IF of CASE aan de slag te gaan en te kijken hoeveel getallen ik heb (met LENGT()) en aan de hand daarvan 0en er voor te zetten, maar dat vind ik niet zo'n elegante oplossing eigenlijk.

Kan iemand misschien iets beters verzinnen? Het liefst een middel om het als string aan LPAD te geven

Waarom ik het overigens een bug noem is dat er in de manual idd staat dat LPAD een string als argument neemt, maar andere functies die dat ook hebben staan lijken er geen moeite mee te hebben als je een integer geeft. Voorts: functies die (volgens de manual) beweren een string terug te geven zouden voor LPAD een oplossing moeten bieden, maar doen dat niet. (voor de zekerheid een getal tussen singel-quotes aan LPAD gegeven en dat lukte idd wel).

Oh, en nog even wat code om te laten zien wat ik gedaan heb:
code:
1
2
3
4
SELECT LPAD('123', 4, 0); /* 0123 */
SELECT LPAD(('123'+1), 4, 0); /* 0000 */
SELECT LPAD((123+1), 4, 0); /* 0000 */
SELECT LPAD(CONCAT((123+1),''), 4, 0); /* 0000 */

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 06-05 18:51

Creepy

Tactical Espionage Splatterer

Dus je noemt het een BUG als in de MySQL handleiding staat dat je een string moet meegeven en je dat niet doet? :D

De voorloop 0 is overigens pure presentatie van je data, iets wat je in dit geval niet zou moeten doen in MySQL. Ik vraag me dan ook af waarom het geen optie is om in PHP bijv. te doen.

Anyway, met CONV zou je een nummer in een string moeten kunnen omzetten. Iets als CONF(veldnaam, 10, 10) zou een string moeten teruggeven. Deze string kan je weer voeren aan LPAD. Niet getest overigens ;)

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


  • marty
  • Registratie: Augustus 2002
  • Laatst online: 27-03-2023
Creepy schreef op woensdag 18 mei 2005 @ 15:17:
Dus je noemt het een BUG als in de MySQL handleiding staat dat je een string moet meegeven en je dat niet doet? :D
Misschien moet je m'n hele redenatie even lezen ;)
Anyway, met CONV zou je een nummer in een string moeten kunnen omzetten. Iets als CONF(veldnaam, 10, 10) zou een string moeten teruggeven. Deze string kan je weer voeren aan LPAD. Niet getest overigens ;)
Kijk en dat is dus onderdeel van de bug / raar gedrag. Zoals ik al meldde werkt een dergelijke truc niet.
(ik heb het bij deze wel getest: SELECT LPAD(CONV((123+1), 10, 10), 4, 0); levert 0000 op)

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 15-04 22:07

NMe

Quia Ego Sic Dico.

marty schreef op woensdag 18 mei 2005 @ 15:41:
Misschien moet je m'n hele redenatie even lezen ;)
Deze?
Waarom ik het overigens een bug noem is dat er in de manual idd staat dat LPAD een string als argument neemt, maar andere functies die dat ook hebben staan lijken er geen moeite mee te hebben als je een integer geeft. Voorts: functies die (volgens de manual) beweren een string terug te geven zouden voor LPAD een oplossing moeten bieden, maar doen dat niet. (voor de zekerheid een getal tussen singel-quotes aan LPAD gegeven en dat lukte idd wel).
Dat vind ik geen redenatie. MySQL is zo goed voor je om foute invoer bij sommige functies af te vangen, maar omdat ie dat bij deze ene niet doet, terwijl dat gewoon in de documentatie staat, is het een bug? Nee hoor. ;)
Kijk en dat is dus onderdeel van de bug / raar gedrag. Zoals ik al meldde werkt een dergelijke truc niet.
(ik heb het bij deze wel getest: SELECT LPAD(CONV((123+1), 10, 10), 4, 0); levert 0000 op)
Dat geeft bij mijn MySQL install gewoon 0124 hoor. Al eens aan updaten gedacht?

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 06-05 18:51

Creepy

Tactical Espionage Splatterer

code:
1
2
3
4
5
6
7
mysql> select LPAD(conv(123+1,10,10),4,0);
+-----------------------------+
| LPAD(conv((123+1),10,10),4,0) |
+-----------------------------+
| 0124                        |
+-----------------------------+
1 row in set (0.00 sec)

Tjah.. welke versie van MySQL gebruik je? Want hier op een 4.0 draait het prima ;)

En jammer dat je niet vertelt waarom het zo nodig in MySQL zelf moet.....

* Creepy aait -NMe- :)

[ Voor 14% gewijzigd door Creepy op 18-05-2005 15:55 ]

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


  • Nyko
  • Registratie: Februari 2001
  • Laatst online: 21:18
-NMe- schreef op woensdag 18 mei 2005 @ 15:51:

[...]

Dat geeft bij mijn MySQL install gewoon 0124 hoor. Al eens aan updaten gedacht?
Hier bij mij werkt het ook op een MySQL 4.0.20 database

Life is a bitch, then you die.


  • marty
  • Registratie: Augustus 2002
  • Laatst online: 27-03-2023
-NMe- schreef op woensdag 18 mei 2005 @ 15:51:
[...]

Deze?

[...]

Dat vind ik geen redenatie. MySQL is zo goed voor je om foute invoer bij sommige functies af te vangen, maar omdat ie dat bij deze ene niet doet, terwijl dat gewoon in de documentatie staat, is het een bug? Nee hoor. ;)
Da's maar de helft van het verhaal.
Deel II legt uit dat diezelfde manual ook aangeeft wat een functie teruggeeft en als er dan staat dat dat een string is dan vind ik het een bug dat LPAD daar kennelijk toch niet mee overweg kan.
Dat geeft bij mijn MySQL install gewoon 0124 hoor. Al eens aan updaten gedacht?
Als jij mij root rechten op die server geeft vind ik dat prima :)
Creepy schreef op woensdag 18 mei 2005 @ 15:54:

Tjah.. welke versie van MySQL gebruik je? Want hier op een 4.0 draait het prima ;)
3.x :(
En jammer dat je niet vertelt waarom het zo nodig in MySQL zelf moet.....
Dat leek me niet zo interessant :)
Laten we het er op houden dat ik nou eenmaal niet overal controle over heb en dus moet roeien met de riemen die ik heb. Dat bespaart mij heel veel tikwerk en jullie een offtopic verhaal waar verder niemand iets aan heeft
Phantom_90 schreef op woensdag 18 mei 2005 @ 16:00:

Hier bij mij werkt het ook op een MySQL 4.0.20 database
Thnx voor het testen.

  • T-MOB
  • Registratie: Maart 2001
  • Laatst online: 22:11
Als het dan toch gewoon op deze manier moet, dan mag het vast ranzig ;)
code:
1
SELECT CONCAT( REPEAT( "0", 4 - CHAR_LENGTH( 123 + 1 ) ) , 123 + 1 )


Tested in MySQL 3.23 btw

[ Voor 13% gewijzigd door T-MOB op 18-05-2005 16:52 ]

Regeren is vooruitschuiven


  • LuCarD
  • Registratie: Januari 2000
  • Niet online

LuCarD

Certified BUFH

T-MOB schreef op woensdag 18 mei 2005 @ 16:52:
Als het dan toch gewoon op deze manier moet, dan mag het vast ranzig ;)
code:
1
SELECT CONCAT( REPEAT( "0", 4 - CHAR_LENGTH( 123 + 1 ) ) , 123 + 1 )


Tested in MySQL 3.23 btw
Doe het dan zo

code:
1
SELECT RIGHT(CONCAT('0000',123+1),4)


getest in 3.23

[ Voor 7% gewijzigd door LuCarD op 18-05-2005 17:13 ]

Programmer - an organism that turns coffee into software.


  • T-MOB
  • Registratie: Maart 2001
  • Laatst online: 22:11
Je hebt helemaal gelijk, ik was in het manual niet verder naar beneden gescrolled dan REPEAT :)

Regeren is vooruitschuiven


  • marty
  • Registratie: Augustus 2002
  • Laatst online: 27-03-2023
LuCarD schreef op woensdag 18 mei 2005 @ 17:13:

code:
1
SELECT RIGHT(CONCAT('0000',123+1),4)


getest in 3.23
Hey, da's een goeie zeg!
Thnx, dat is precies waar ik zelf niet op kon komen :)
Pagina: 1