/ Forside / Teknologi / Udvikling / SQL / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
SQL
#NavnPoint
pmbruun 1704
niller 962
fehaar 730
Interkril.. 701
ellebye 510
pawel 510
rpje 405
pete 350
gibson 320
10  smorch 260
[MySQL] Problemer med dansk tegnsætning
Fra : Kasper Heftholm Kris~


Dato : 23-08-05 10:02

For nylig skiftede jeg til et webhotel med en ældre MySQL-version end
før og har derefter haft en del problemer med tegnsætning som jeg ikke
før har oplevet. Det drejer sig om en phpBB-database og har sikkert
noget at gøre med UTF-8 og iso-8859-1 tegnsættene.

Problemet kan koges ned til ('tekst' er af typen varchar(50) og er
ikke UNIQUE):

insert into test (tekst) values ('Æble');
insert into test (tekst) values ('æble');

Ovenstående virker fint og tegnsætningen er korrekt med stort og
lille Æ og æ.

Ændrer jeg nu 'tekst' til at være UNIQUE, tømmer 'test' og prøver
igen, så får jeg følgende fejl: Duplicate entry 'æble' for key 1

Nu kan der altså tilsyneladende ikke skelnes mellem stort og småt Æ og
æ.

Jeg bruger phpMyAdmin 2.6.0-pl1 til at lave ændringer og kører MySQL
4.0.24

Tegnsættet jeg kører med i phpMyAdmin er iso-8859-1. Jeg har prøvet at
ændre det til UTF-8. Så virker ovenstående, MEN til gengæld så har
alle de andre phpBB poster forkerte tegn og tegnene bliver ikke vist
korrekt i phpBB.


Hvad gør jeg galt?


Mvh.

Kasper

 
 
Martin (23-08-2005)
Kommentar
Fra : Martin


Dato : 23-08-05 14:50

-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

Kasper Heftholm Kristensen wrote:
> Ændrer jeg nu 'tekst' til at være UNIQUE, tømmer 'test' og prøver
> igen, så får jeg følgende fejl: Duplicate entry 'æble' for key 1

Hvorfor vil du også have tekst til at være unique?
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.2.1 (MingW32)

iD8DBQFDCymcAxDV/8Li8MYRAlB4AJ4qDN2OHGI4Z4kg5cWB6WHr5vyIrACeIj6u
ktZWzw+FvEoCs9eSHzTW3Xo=
=GxtF
-----END PGP SIGNATURE-----

Kim Bach Petersen (23-08-2005)
Kommentar
Fra : Kim Bach Petersen


Dato : 23-08-05 16:11

Kasper Heftholm Kristensen wrote:

> Problemet kan koges ned til ('tekst' er af typen varchar(50) og er
> ikke UNIQUE):
>
> insert into test (tekst) values ('Æble');
> insert into test (tekst) values ('æble');
>
> Ovenstående virker fint og tegnsætningen er korrekt med stort og
> lille Æ og æ.
>
> Ændrer jeg nu 'tekst' til at være UNIQUE, tømmer 'test' og prøver
> igen, så får jeg følgende fejl: Duplicate entry 'æble' for key 1
>
> Nu kan der altså tilsyneladende ikke skelnes mellem stort og småt Æ og
> æ.

Jeg ved ikke med sikkerhed, om det lige er det, der skal til, men prøv
at lave felt-typen om til

   VARCHAR(50) BINARY

hvor BINARY angiver af feltet skal håndteres case-sensitivt.

Kim

Peter Brodersen (23-08-2005)
Kommentar
Fra : Peter Brodersen


Dato : 23-08-05 16:24

On Tue, 23 Aug 2005 11:01:34 +0200, Kasper Heftholm Kristensen
<nospam@nospam.invalid> wrote:

>Nu kan der altså tilsyneladende ikke skelnes mellem stort og småt Æ og
>æ.

Det er netop en feature, at der ikke skelnes mellem store og små
bogstaver for tekstfelter. Det samme gælder med alle andre bogstaver,
og er ikke specifikt for danske bogstaver (men inkluderer bare netop
også danske bogstaver).

For et UNIQUE-tekstfelt vil følgende fx også give en korrekt fejl:

insert into test (tekst) values ('Peter');
insert into test (tekst) values ('peter');

Det gælder for tekstfelter. BLOB og lignende er ikke omfattet af
dette.


Hvis du virkelig ønsker at skelne mellem store og små bogstaver, så
bør du angive feltet som værende BINARY (hvilket i nyere MySQL'er blot
er anden måde at angive, at man vil bruge en binary collation, fx
latin1_bin).

Altså:

mysql> CREATE TABLE a (tekst VARCHAR(50) PRIMARY KEY);
mysql> INSERT INTO a VALUES ("peter");
mysql> INSERT INTO a VALUES ("Peter");
ERROR 1062 (23000): Duplicate entry 'Peter' for key 1
mysql> INSERT INTO a VALUES ("æble");
mysql> INSERT INTO a VALUES ("Æble");
ERROR 1062 (23000): Duplicate entry 'Æble' for key 1

mysql> CREATE TABLE b (tekst VARCHAR(50) BINARY PRIMARY KEY);
mysql> INSERT INTO b VALUES ("peter");
mysql> INSERT INTO b VALUES ("Peter");
mysql> INSERT INTO b VALUES ("æble");
mysql> INSERT INTO b VALUES ("Æble");

I sidstnævnte tilfælde bliver feltet tekst sat til:
character set latin1 collate latin1_bin

Man kan stadigvæk sagtens bruge fx UPPER() og LOWER() på teksten, hvis
man vil det.

--
- Peter Brodersen

Kasper Heftholm Kris~ (23-08-2005)
Kommentar
Fra : Kasper Heftholm Kris~


Dato : 23-08-05 20:58

On Tue, 23 Aug 2005 17:24:06 +0200, Peter Brodersen
<usenet2005@ter.dk> wrote:

>On Tue, 23 Aug 2005 11:01:34 +0200, Kasper Heftholm Kristensen
><nospam@nospam.invalid> wrote:
>
>>Nu kan der altså tilsyneladende ikke skelnes mellem stort og småt Æ og
>>æ.
>

Det er sandt, kan jeg godt se nu. Har samme problem med accenter, det
var bare æøå jeg stødte på først.

>Hvis du virkelig ønsker at skelne mellem store og små bogstaver, så
>bør du angive feltet som værende BINARY (hvilket i nyere MySQL'er blot
>er anden måde at angive, at man vil bruge en binary collation, fx
>latin1_bin).
>

Tak for det, det var lige det der skulle til, nu er jeg kommet videre.

Mvh.

Kasper



Søg
Reklame
Statistik
Spørgsmål : 177459
Tips : 31964
Nyheder : 719565
Indlæg : 6408195
Brugere : 218881

Månedens bedste
Årets bedste
Sidste års bedste