sql >> Databasteknik >  >> RDS >> Mysql

Lagrade icke-engelska tecken, fick '?????' - Problem med MySQL-teckenuppsättning

Dåliga nyheter. Men först, dubbelkolla:

SELECT col, HEX(col)...

för att se vad som står i tabellen. Om hex visar 3F , då är data borta. Korrekt lagrad, dal tecknet ska vara hex D8AF; hah är hex D8AD .

Vad hände:

  • du hade utf8-kodad data (bra)
  • SET NAMES latin1 var i kraft (standard, men fel)
  • kolumnen deklarerades CHARACTER SET latin1 (standard, men fel)

Som du INSERTed informationen konverterades till latin1, som inte har värden för farsi-tecken, så frågetecken ersatte dem.

Botemedlet (för framtida `INSERTs):

  • Koda om din applikation med mysqli_*-gränssnittet istället för det utfasade mysql_*-gränssnittet.
  • utf8-kodad data (bra)
  • mysqli_set_charset('utf8')
  • kontrollera att kolumn(erna) och/eller tabellstandard är CHARACTER SET utf8
  • Om du visar på en webbsida, <meta...utf8> bör vara nära toppen.

Diskussionen ovan handlar om CHARACTER SET , kodning av tecken. Nu till ett tips om COLLATION , som används för att jämföra och sortera.

Om du vill att dessa ska behandlas lika:'بِسْمِ' ='بسم', använd sedan utf8_unicode_ci (istället för utf8_general_ci) för COLLATION .




  1. FILE_ID() vs FILE_IDEX() i SQL Server:Vad är skillnaden?

  2. Hur får jag kolumnnamn i Laravel 4?

  3. Bindning av parametrar till Oracle Dynamic SQL

  4. Tips för att leverera MySQL-databasprestanda - del ett