Avatar billede carstenandersen Nybegynder
08. november 2010 - 15:23 Der er 13 kommentarer og
2 løsninger

Ændre text til varchar

Hej eksperter

Jeg er skiftet til mysql 5.1 og her er det åbenbart ikke muligt at have "blank" standardværdi, hvis man vælger "text". Forudfyldes altid med "None", hvilket giver problemer ved f.eks. "Replace".

Jeg har derfor forsøgt at ændre til "Varchar", men her er der stor forskel på, hvor meget jeg kan sætte længden til. Nogle kan ændres til 65000, mens jeg kun kan indtaste en længde på 300 ved andre - hvordan hænger det lige sammen? Fejlen i mysql er:

SQL-forespørgsel:

ALTER TABLE `Sider04112010` CHANGE `Tabeller` `Tabeller` VARCHAR( 1000 ) CHARACTER SET latin1 COLLATE latin1_danish_ci NOT NULL DEFAULT ''

MySQL returnerede: 

#1118 - Row size too large. The maximum row size for the used table type, not counting BLOBs, is 65535. You have to change some columns to TEXT or BLOBs
Avatar billede mcb2001 Nybegynder
08. november 2010 - 15:36 #1
har du nogle databaser i MyIsam og andre i InnoDb?
Avatar billede carstenandersen Nybegynder
08. november 2010 - 15:45 #2
Jeg aner absolut intet om dette, men kan se, at der i den gamle database står Mylsam, men der står InnoDb i den nye database. Nogen betydning?

Problemer med de forskellige længder af Varchar er dog i den samme database.
Avatar billede mcb2001 Nybegynder
08. november 2010 - 16:20 #3
Kig eventuelt her:

http://dev.mysql.com/doc/refman/5.0/en/char.html

Det er sådan at du samlet hen over alle kolonner maksimalt kan bruge 65535 bytes, hvorfor du for nogle kan have 100 tegn, og andre kan have 1.000 tegn.

Dette kan kun omgås ved at bruge TEXT, da denne ligges "for sig" og derfor kan indholde vilkårligt meget tekst.

Så min anbefaling til dig må være at du ændrer din REPLACE til at tage højde for None og så bruger TEXT.
Avatar billede carstenandersen Nybegynder
08. november 2010 - 16:32 #4
Ok, super.

Jeg syntes at have prøvet alt for at kunne tage højde for None, men intet er lykkedes. Kan du klare den? Koden er f.eks.:

...
Undersider = rs("Undersidertilknyttet")
Undersider = replace(Undersider, ",,", ",")
Undersider = replace(Undersider, "##", "#")
Undersider = replace(Undersider, ",", "")
Undersider = replace(Undersider, "##", "#,#")
filnavn=Split(Undersider,",")
...
Avatar billede mcb2001 Nybegynder
08. november 2010 - 16:52 #5
i MySQL kan du bruge

SELECT CONCAT('',`row_name`)
FROM `tbl_name`

og så returnerer den '' i stedet for alt muligt andet hvis der ikke står noget.
Avatar billede carstenandersen Nybegynder
08. november 2010 - 17:30 #6
Lyder rigtig spændende, hvis det kan løse problemet.

Har aldrig før prøvet CONCAT og har lidt svært ved at se, hvordan det skal indføjes, så hvordan ser nedenstående kode ud med CONCAT:

SQL = "Select * from Sider04112010 where Id= '" & Request.QueryString("Id") & "'"
Avatar billede mcb2001 Nybegynder
08. november 2010 - 17:49 #7
du kan ikke bruge den i den, da du bruger * ...

du skal skrive

SELECT a, b, CONCAT('', c), d, e
FROM tbl_name
Avatar billede carstenandersen Nybegynder
08. november 2010 - 19:19 #8
Ok, det vil jeg prøve at arbejde videre med. Tusind tak for hjælpen. Smid et svar.
Avatar billede arne_v Ekspert
09. november 2010 - 01:57 #9
Jeg har mere fidus til COALESCE(felt,'') end til CONCAT('',felt)
Avatar billede mcb2001 Nybegynder
09. november 2010 - 08:53 #10
COALESCE giver den første værdi i rækken der ikke er NULL.

Og et tekst felt med '' eller None er ikke NULL, så det vil være den der bliver parset retur. Og så er man ligevidt.
Avatar billede mcb2001 Nybegynder
09. november 2010 - 08:53 #11
og du tildeler point som du mener korrekt.
Avatar billede carstenandersen Nybegynder
09. november 2010 - 10:35 #12
Her til nat / morgen lykkedes det faktisk via ændring af text til varchar - skulle ændres mange steder, men er ved at lykkedes :-)

Tusind tak for hjælpen.

Der er 175 point til mcb2001 og 25 til arne_v, så arne_v, smid et svar.
Avatar billede carstenandersen Nybegynder
09. november 2010 - 10:37 #13
Havde lige glemt, at dette spørgsmål "kun" var 100 point, så 85 til mcb2001 og 15 til arne_v
Avatar billede arne_v Ekspert
09. november 2010 - 22:38 #14
mysql> CREATE TABLE textus (id INTEGER PRIMARY KEY, txtf TEXT);
Query OK, 0 rows affected (0.02 sec)

mysql> INSERT INTO textus VALUES(1, 'xxx');
Query OK, 1 row affected (0.00 sec)

mysql> INSERT INTO textus VALUES(2, '');
Query OK, 1 row affected (0.00 sec)

mysql> INSERT INTO textus VALUES(3, NULL);
Query OK, 1 row affected (0.00 sec)

mysql> SELECT id,txtf,CONCAT('', txtf),COALESCE(txtf,'') FROM textus;
+----+------+------------------+-------------------+
| id | txtf | CONCAT('', txtf) | COALESCE(txtf,'') |
+----+------+------------------+-------------------+
|  1 | xxx  | xxx              | xxx              |
|  2 |      |                  |                  |
|  3 | NULL | NULL            |                  |
+----+------+------------------+-------------------+
3 rows in set (0.00 sec)

mysql> DROP TABLE textus;
Query OK, 0 rows affected (0.01 sec)
Avatar billede arne_v Ekspert
09. november 2010 - 22:38 #15
og et svar fra mig
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