Avatar billede dannv Nybegynder
21. januar 2004 - 07:22 Der er 24 kommentarer og
1 løsning

trim i MySQL

Hvorfor virker følgende ikke:

update compound set chemical_name = trim(chemical_name)

Den skulle gerne gøre at "name " blev til "name"..altså uden mellemrum tilsidst. MySQL siger at 3222 rækker matchede men at den ikke har ændret nogen... hvorfor??
Avatar billede arne_v Ekspert
21. januar 2004 - 07:56 #1
Er chemical_name VARCHAR ? (virker næppe med CHAR)
Avatar billede limemedia Nybegynder
21. januar 2004 - 07:57 #2
ifølge manualen anvender du trim korrekt

TRIM([[BOTH | LEADING | TRAILING] [remstr] FROM] str)
    Returns the string str with all remstr prefixes and/or suffixes removed. If none of the specifiers BOTH, LEADING or TRAILING are given, BOTH is assumed. If remstr is not specified, spaces are removed:

mysql> SELECT TRIM('  bar  ');
        -> 'bar'
mysql> SELECT TRIM(LEADING 'x' FROM 'xxxbarxxx');
        -> 'barxxx'
mysql> SELECT TRIM(BOTH 'x' FROM 'xxxbarxxx');
        -> 'bar'
mysql> SELECT TRIM(TRAILING 'xyz' FROM 'barxxyz');
        -> 'barx'

    This function is multi-byte safe.

Hvilken mysql version anvender du på hvilken platform ?

At mysql matcher 3222 records, betyder ikke at der reelt skete ændringer i disse 3222 rækker, men at den gik disse igennem. Du har sikkert 3222 rækker i din tabel

Der er tilfældigvis ikke en kontrolkarakter, ala en tab, newline eller andet der driller dig ?
Avatar billede dannv Nybegynder
21. januar 2004 - 07:57 #3
chemical_name = varchar(255)
Avatar billede dannv Nybegynder
21. januar 2004 - 07:57 #4
og godmorgen.
Avatar billede dannv Nybegynder
21. januar 2004 - 08:01 #5
Jeg kan ikke lige se at der skulle være nogle karakterer som skulle gøre at det ikke kunna lade sig gøre. Et typisk data kunne se således ud: "2',6'-DIMETHOXYACETOPHENONE ", og væk skal det sidste mellemrum gerne...
Avatar billede limemedia Nybegynder
21. januar 2004 - 08:04 #6
Forsøg evt med RTRIM, selvom det ikke burde ændre noget - dén har jeg selv anvendt før
Avatar billede dannv Nybegynder
21. januar 2004 - 08:08 #7
virker heller ikke med RTRIM, samme melding fra MySQL.
Avatar billede dannv Nybegynder
21. januar 2004 - 08:12 #8
Jeg kører en MySQL 4.0.12, operativ system = W2K, og kører via mysql control center.
Avatar billede erikjacobsen Ekspert
21. januar 2004 - 10:09 #9
Der burde slet ikke være blanke til sidst i en varchar. Mysql skriver selv:

......VARCHAR(M) [BINARY]
A variable-length string. Note: trailing spaces are removed when the value is stored (this differs from the ANSI SQL specification).

Så du skulle slet ikke have behov for at fjerne dem. Og derfor sker der heller
ingenting ved den sql-sætning du skriver i spørgsmålet.
Avatar billede dannv Nybegynder
21. januar 2004 - 13:52 #10
ikke desto mindre er der blankt tegn i slutningen af data.. Data er loaded fra en csv fil. Hvad gør jeg så for at fjerne de blanke tegn??
Avatar billede erikjacobsen Ekspert
21. januar 2004 - 16:00 #11
Det er nok ikke et mellemrum, men noget andet. Har du et link til et sted hvor vi fx kan
se en udskrift af noget fra databasen.
Avatar billede limemedia Nybegynder
21. januar 2004 - 16:10 #12
prøv en
SELECT ASCII(RIGHT(chemical_name,1))

dén bør returnere ascii værdien for dit "spooky" mellemrum
Avatar billede dannv Nybegynder
21. januar 2004 - 16:18 #13
returnere 160, hvilket så vidt jeg finde ud af er 'á'. Hvad er dette tegn, for jeg kan ikke se noget, kun at der er et mellemrum.

Mit site ligger ikke på en offentlig tilgængelig server...
Avatar billede dannv Nybegynder
21. januar 2004 - 16:23 #14
udfra følgede site http://www.bbsinc.com/symbol.html kan jeg se at html koden   netop er et mellemrum... forklare det noget eller?
Avatar billede limemedia Nybegynder
21. januar 2004 - 16:27 #15
slog også op at det er et space... ganske mystisk...

skal du køre din "rens data" én gang eller mere fast. Der kan hurtigt kodes et hack der fjerner de spaces, hvis dét er det.

men så skal du jo i den kode du bruger til at populere din database, sikre at disse mellemrum ikke optræder igen
Avatar billede dannv Nybegynder
21. januar 2004 - 16:29 #16
der er loaded data i databasen via en csv fil, og der er der blevet introduceret det famøse mellemrum. Fremover bliver data formateret i java inden det ligges i basen og derfor vil/bør/kan/må det ikke forekomme fremover, så der er tale om et once only...
Avatar billede limemedia Nybegynder
21. januar 2004 - 16:33 #17
Noget ala
UPDATE compound
SET chemical_name = SUBSTRING(chemical_name,0,LENGTH(chemical_name)-1)
WHERE ASCII(RIGHT(chemical_name,1))=160

bør virke som et "ugly hack"... men test den lige på en temporær tabel før du kører den på produktionsdata :) den er ganske utestet
Avatar billede dannv Nybegynder
21. januar 2004 - 16:36 #18
Jeg forestiller mig noget i retning af:

update compound set chemical_name = chemical_name.lenght-1
where id = (select id from compound where ASCII(RIGHT(chemical_name,1)) = 160)
Avatar billede arne_v Ekspert
21. januar 2004 - 16:52 #19
update compound set chemical_name = replace(chemical_name, char(160), '')

er kortere og sikrere.
Avatar billede arne_v Ekspert
21. januar 2004 - 16:54 #20
160 er "non breaking space"

kendt som   i HTML !
Avatar billede limemedia Nybegynder
21. januar 2004 - 16:55 #21
lidt farligt at anvende replace, hvis der i strengen kan eksistere et mellemrum der skal overleve
Avatar billede arne_v Ekspert
21. januar 2004 - 17:01 #22
Den erstatter ikke normale spaces, kun non breaking spaces.

Men hvis man tror at der også skulel være sådan nogen midt i teksten kan man:

update compound set chemical_name = trim(replace(chemical_name, char(160), ' '))
Avatar billede dannv Nybegynder
21. januar 2004 - 17:17 #23
Så lykkedes det langt om længe.
Avatar billede dannv Nybegynder
21. januar 2004 - 17:19 #24
points til arne kan findes her: http://www.eksperten.dk/spm/454749
Avatar billede dannv Nybegynder
21. januar 2004 - 17:20 #25
Beklager der er mos i min hjerne: http://www.eksperten.dk/spm/455008
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester