sql >> Database >  >> RDS >> Mysql

Utf8 gebruiken of niet - MySQL- en PHP-tekencoderingsprobleem

Uw probleem is dat uw SET NAMES 'utf8_persian_ci' opdracht was ongeldig (utf8_persion_ci is een verzameling , geen codering ). Als u het in een terminal uitvoert, ziet u een fout Unknown character set: 'utf8_persian_ci' . Dus uw toepassing, wanneer deze opgeslagen de gegevens, gebruikte de latin1 karakterset. MySQL interpreteerde uw invoer als latin1-tekens die het vervolgens gecodeerd opsloeg als utf-8. Op dezelfde manier converteerde MySQL, toen de gegevens werden teruggetrokken, deze van UTF-8 terug naar latin1 en (hopelijk meestal) de originele bytes die u eraan gaf.

Met andere woorden, al je gegevens in de database zijn volledig in de war, maar het werkte gewoon zo.

Om dit op te lossen, moet je ongedaan maken wat je hebt gedaan. De meest eenvoudige manier is om PHP te gebruiken:

  1. SET NAMES latin1;
  2. Selecteer elk afzonderlijk tekstveld uit elke tabel.
  3. SET NAMES utf8;
  4. Update dezelfde rijen met dezelfde string ongewijzigd.

Als alternatief kunt u deze stappen in MySQL uitvoeren, maar het is lastig omdat MySQL begrijpt dat de gegevens zich in een bepaalde tekenset bevinden. U moet uw tekstkolommen wijzigen in een BLOB-type en ze vervolgens aanpassen terug naar teksttypen met een utf8-tekenset. Zie het gedeelte onderaan de ALTER TABLE MySQL-documentatie met het label "Waarschuwing" in het rood .

Nadat u een van deze dingen hebt gedaan, zullen de bytes die in uw databasekolommen zijn opgeslagen, de werkelijke tekenset zijn die ze beweren te zijn. Dan, zorg ervoor dat je altijd mysql_set_charset('utf8') op elke databasetoegang vanuit PHP die u in de toekomst mogelijk zult doen! Anders verpest je de boel weer. (Let op, gebruik geen eenvoudige mysql_query('SET NAMES utf8') ! Er zijn hoekgevallen (zoals een reset-verbinding) waar dit kan worden gereset naar latin1 zonder uw medeweten. mysql_set_charset() zal de tekenset instellen wanneer dat nodig is.)

Het zou het beste zijn als u overschakelde van mysql_* functies en gebruikte PDO in plaats daarvan met de charset=utf8 parameter in uw BOB dsn .



  1. Een opgeslagen procedure aanroepen binnen een opgeslagen procedure

  2. Hoe MAKE_SET() werkt in MariaDB

  3. Salesforce SOQL van SQL Server

  4. PHP PDO versus normale mysql_connect