Avatar billede timmwillum Nybegynder
21. juli 2008 - 21:37 Der er 11 kommentarer og
1 løsning

phpMyAdmin - collation og attributter

Hej alle

OK jeg er så HELT ny i MySQL ... forsøger lige nu at omlægge en db fra Acces til MySQL og mit webhotel har et hjælpeprogram kaldet phpMyAdmin (jeg programmerer normalt i asp, hvilket overhovedet ikke er relevant i den her forbindelse).

Når jeg skal oprette kolonner i min tabel bliver jeg stillet over for en række valgmuligheder. Og et par af dem forstår jeg sku' ikke helt.

Kollation/Collation:
Her får jeg et rullegardin med en bunke uforståelig vollapyk. Som default står den til "latin1_sweedish_ci". Hvad er det? Hvad skal jeg vælge?

Attributter:
Her får jeg et rullegardin med BINARY, UNSIGNED, UNSIGNED ZEROFILL, ON-UPDATE CURRENT_TIMESTAMP. Hvad er det? Hvad skal jeg vælge?

Herudover har jeg under "Ekstra" mulighed for at vælge auto increment, hvilket jeg går ud fra, er det, jeg fra Access kender som autonummerering. Men det kan vel kun vælges til en almindelig taltype ... hvilket vel er INT (integer) i MySQL?

Jeg håber, at nogen kan hjælpe ...
Avatar billede arne_v Ekspert
22. juli 2008 - 00:36 #1
auto increment = auto nummerering

du kan vælge det til flere forskellige tal typer i MySQL
Avatar billede arne_v Ekspert
22. juli 2008 - 00:36 #2
collation styrer sortering
Avatar billede arne_v Ekspert
22. juli 2008 - 00:44 #3
Det sidste kan illustreres med:

mysql> CREATE TABLE demo (
    ->    id INTEGER NOT NULL PRIMARY KEY,
    ->    s VARCHAR(50)
    -> ) DEFAULT CHARACTER SET latin1 COLLATE latin1_bin;
Query OK, 0 rows affected (0.03 sec)

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

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

mysql> INSERT INTO demo VALUES (3, 'C');
Query OK, 1 row affected (0.00 sec)

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

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

mysql> INSERT INTO demo VALUES (6, '3');
Query OK, 1 row affected (0.00 sec)

mysql> INSERT INTO demo VALUES (7, 'Æ');
Query OK, 1 row affected (0.00 sec)

mysql> INSERT INTO demo VALUES (8, 'O');
Query OK, 1 row affected (0.00 sec)

mysql> INSERT INTO demo VALUES (9, 'Å');
Query OK, 1 row affected (0.00 sec)

mysql> INSERT INTO demo VALUES (10, 'E');
Query OK, 1 row affected (0.00 sec)

mysql> INSERT INTO demo VALUES (11, 'É');
Query OK, 1 row affected (0.00 sec)

mysql> INSERT INTO demo VALUES (12, 'E');
Query OK, 1 row affected (0.00 sec)

mysql>
mysql> SELECT * FROM demo ORDER BY s;
+----+------+
| id | s    |
+----+------+
|  4 | 1    |
|  5 | 2    |
|  6 | 3    |
|  1 | A    |
|  2 | B    |
|  3 | C    |
| 10 | E    |
| 12 | E    |
|  8 | O    |
|  9 | Å    |
| 11 | É    |
|  7 | Æ    |
+----+------+
12 rows in set (0.00 sec)

mysql>
mysql> DROP TABLE demo;
Query OK, 0 rows affected (0.00 sec)

mysql>
mysql> CREATE TABLE demo (
    ->    id INTEGER NOT NULL PRIMARY KEY,
    ->    s VARCHAR(50)
    -> ) DEFAULT CHARACTER SET latin1 COLLATE latin1_general_ci;
Query OK, 0 rows affected (0.01 sec)

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

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

mysql> INSERT INTO demo VALUES (3, 'C');
Query OK, 1 row affected (0.00 sec)

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

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

mysql> INSERT INTO demo VALUES (6, '3');
Query OK, 1 row affected (0.00 sec)

mysql> INSERT INTO demo VALUES (7, 'Æ');
Query OK, 1 row affected (0.00 sec)

mysql> INSERT INTO demo VALUES (8, 'O');
Query OK, 1 row affected (0.00 sec)

mysql> INSERT INTO demo VALUES (9, 'Å');
Query OK, 1 row affected (0.00 sec)

mysql> INSERT INTO demo VALUES (10, 'E');
Query OK, 1 row affected (0.00 sec)

mysql> INSERT INTO demo VALUES (11, 'É');
Query OK, 1 row affected (0.00 sec)

mysql> INSERT INTO demo VALUES (12, 'E');
Query OK, 1 row affected (0.00 sec)

mysql>
mysql> SELECT * FROM demo ORDER BY s;
+----+------+
| id | s    |
+----+------+
|  4 | 1    |
|  5 | 2    |
|  6 | 3    |
|  1 | A    |
|  2 | B    |
|  3 | C    |
| 10 | E    |
| 12 | E    |
|  8 | O    |
|  9 | Å    |
| 11 | É    |
|  7 | Æ    |
+----+------+
12 rows in set (0.00 sec)

mysql>
mysql> DROP TABLE demo;
Query OK, 0 rows affected (0.00 sec)

mysql>
mysql> CREATE TABLE demo (
    ->    id INTEGER NOT NULL PRIMARY KEY,
    ->    s VARCHAR(50)
    -> ) DEFAULT CHARACTER SET latin1 COLLATE latin1_danish_ci;
Query OK, 0 rows affected (0.00 sec)

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

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

mysql> INSERT INTO demo VALUES (3, 'C');
Query OK, 1 row affected (0.00 sec)

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

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

mysql> INSERT INTO demo VALUES (6, '3');
Query OK, 1 row affected (0.00 sec)

mysql> INSERT INTO demo VALUES (7, 'Æ');
Query OK, 1 row affected (0.00 sec)

mysql> INSERT INTO demo VALUES (8, 'O');
Query OK, 1 row affected (0.00 sec)

mysql> INSERT INTO demo VALUES (9, 'Å');
Query OK, 1 row affected (0.00 sec)

mysql> INSERT INTO demo VALUES (10, 'E');
Query OK, 1 row affected (0.00 sec)

mysql> INSERT INTO demo VALUES (11, 'É');
Query OK, 1 row affected (0.00 sec)

mysql> INSERT INTO demo VALUES (12, 'E');
Query OK, 1 row affected (0.00 sec)

mysql>
mysql> SELECT * FROM demo ORDER BY s;
+----+------+
| id | s    |
+----+------+
|  4 | 1    |
|  5 | 2    |
|  6 | 3    |
|  1 | A    |
|  2 | B    |
|  3 | C    |
| 10 | E    |
| 12 | E    |
|  8 | O    |
|  9 | Å    |
| 11 | É    |
|  7 | Æ    |
+----+------+
12 rows in set (0.00 sec)

mysql>
mysql> DROP TABLE demo;
Query OK, 0 rows affected (0.00 sec)
Avatar billede arne_v Ekspert
22. juli 2008 - 00:46 #4
Det gik vist lidt i ged med de special tegn.
Avatar billede arne_v Ekspert
22. juli 2008 - 00:52 #5
output er:

4    1
5    2
6    3
1    A
2    B
3    C
10    E
9    Å
7    Æ
12    È
11    É
8    Ø

4    1
5    2
6    3
1    A
9    Å
7    Æ
2    B
3    C
10    E
12    È
11    É
8    Ø

4    1
5    2
6    3
1    A
2    B
3    C
11    É
10    E
12    È
7    Æ
8    Ø
9    Å

når man bruger der forstår ÆØÅ !
Avatar billede gnoname Praktikant
22. juli 2008 - 03:38 #6
En Collation: En collation er en sortering og vægtning af et tegnsæt. Til ethvert tegnsæt hører en eller flere Collationer.
Dvs. collationen bestemmer hvordan tegnsættet skal sorteres og sammenlignes. Eksempel: 'ü' kan i en collation opfattes som værende lig 'y', men i en anden som værende lig 'ue'.

Her er et link til collationerne i MySql 6.0, hvor du kan se hvilke tegn der opfattes som værende ens og hvordan de sorteres: http://www.collation-charts.org/mysql60/

Jeg vil selv foretrække "latin1_danish_ci", som du nok kan forstå, hvis du har fulgt på ovenstående link; utf8_danish_ci burde egenligt være bedre, men der er åbenbart nogle børnesygdomme forbundet med den (det er nok ikke danskere, der har konstrueret den).

Attributter;

BINARY (kun char og varchar kolonner): betyder at data i kolonnen vil blive sorteret efter den numeriske værdi af feltets indhold af bytes (og ikke som default ihht. feltets collation).

UNSIGNED (kun numeriske kolonner): betyder at indholdet i feltet kun kan være uden fortegn - dvs. kun positive værdier er tilladt, men dermed er der også plads til dobbelt så store værdier i feltet.

UNSIGNED ZEROFILL (kun numeriske kolonner): feltet udfyldes med foranstillede nuller: indsættes værdien 6 i et int(5) felt med denne attribut sat, vil indholdet være; '00006'

ON-UPDATE CURRENT_TIMESTAMP (kun date og time kolonner): Ved opdatering af ebn record vil dette felt blive stemplet med opdateringstidspunktet.

auto increment (kun numeriske kolonner): Feltet bliver talt en op for hver gang der tilføjes en ny record i tabellen (jeg ved ikke om dette er tilfældet i Access? - jeg kender kun til rigtige databaser :)
Avatar billede timmwillum Nybegynder
22. juli 2008 - 09:35 #7
gnoname:
Tak for fint svar.

arne_v:
Tak for kommentaren ... men du tabte mig lidt under vejs. Hvad er poienten? ... at tallene sorteres forskelligt?

Kan man i øvrigt nulstille en auto increment, når den først er i gang med at tælle?
Avatar billede gnoname Praktikant
22. juli 2008 - 12:23 #8
Du kan resette på denne måde:

DROP feltet med auto_incrementing.
ALTER tabellen for at ADD'e feltet igen med samme attribut.

Så vil alle eksisterende rækker blive renummereret fra 1 og op til antallet af rækker.

Du kan også vælge at starte (eller fortsætte) med en anden værdi end 1 (eller det tal autoincrement i øjeblikket er kommet til). Efter denne kommando vil næste række få tallet 101 i feltet:

ALTER TABLE tabelnavn AUTO_INCREMENT = 100;

Du kan ikke fortsætte med en værdi, hvis den allerede findes - dvs. du kan ikke have to rækker med samme nummer i feltet.
Avatar billede arne_v Ekspert
22. juli 2008 - 15:12 #9
Pointen er at tekster sorteres forskelligt.
Avatar billede timmwillum Nybegynder
22. juli 2008 - 21:51 #10
Tak for jeres hjælp begge to ... kan jeg tillade mig et par ekstra spørgsmål? Jeg prøver ;-)

1. I Acces har man en funktion til at lave relationer mellem kollonner i de forskellige tabeller. Fx kan man sætte en relation mellem brugernavn i tabel 1 og brugernavn i tabel 2. Ideen er så, at man ikke kan oprette en record tabel 2 med et brugernavn, som ikke også eksisterer i tabel 1. Det skulle efter sigende gøre databasen hurtigere, og samtidig giver det i access mulighed for kaskadevis sletning af fx al information relateret til en bruger, når brugeren slettes. Eksisterer det begreb i MySQL? Og i så fald, hvordan bruges det?

2. Og så endnu et spørgsmål til opbygning af min tabel. Når jeg laver en ny kollonne har jeg en radioknap, hvor jeg kan vælge mellem "Primær", "Unik" og "Index". Primær kender jeg fra Access (nøgleikonet), som en form for nøgle, hvilket indikerer, at der ikke kan være to ens entries i den kollonne. Men er det ikke det samme som "Unik" ... eller hvad? Og hvordan er det så relateret til "Index"? Jeg kan jo kun vælge en af delene for hver kollonne. Web10 skriver i øvrigt, at man skal/bør indexere sine tabeller. Men jeg har ikke helt forstået ideen i indexeringen ... hvad er formålet og hvad gør indexering?
Avatar billede gnoname Praktikant
23. juli 2008 - 21:07 #11
1: Jo, det er det man i RDBMS sprog kalder Foreign Key; I MySql (og Oracle mv.) implementerer man en FK på denne måde:

CONSTRAINT herSkriverDuEtNavnPåDinConstraint FOREIGN KEY (kolonnenavnITabellen)
REFERENCES herSkriverDuDenRefereredeTabelsNavn (kolonnenavnIDenRefereredeTabel);

Du kan også lade din FK bestå af flere felter (et index) - så skal du bare angive en kommasepareret liste af kolonnenavne istedet for ét kolonnenavn.

2: Primær betyder at det er en nøgle (som dermed per automatik også er unik), unik betyder blot at der ikke kan være dubletter i kolonnen og Index må betyde at der oprettes et index på kolonnen.

Formålet med indeksering ar hurtigere tilgang til tabellen. Når der er meget data i en tabel kan et indeks betyde, at et query bliver tusind gange hurtigere.
Avatar billede timmwillum Nybegynder
23. juli 2008 - 22:37 #12
Tak igen

Det der foreign key bliver nok for kryptisk. Jeg arbejder som nævnt i MySQL db via phpMyAdmin, og der er der ikke umiddelbart nogen funktion relateret til foreign key. Men det går nok også uden ...
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