База данных неправильно хранит греческие символы

#php #mysql

#php #mysql

Вопрос:

Добрый день всем и каждому,

Недавно я развернул веб-сайт на удаленном сервере и, используя тот же скрипт создания MySQL, создал базу данных. В двух полях должны отображаться греческие символы, и поэтому для их сортировки установлено значение greek_general_ci. Это отлично работает на моем локальном компьютере разработчика (который такой же, как настроен на сервере, возможно, несколько настроек безопасности отличаются.) Однако…

Я пошел, чтобы добавить кое-что в базу данных, и все, что я получаю в базе данных, это????? вместо кодов Unicode с греческими символами, которые я получаю на своем локальном компьютере.

Я проверил, что на сервере включены параметры сортировки и правильные наборы символов. И я поискал ответ в Google, но, увы, у меня не было успеха. Мне было интересно, могу ли я это исправить, или мне следует связаться с администратором сервера, чтобы они посмотрели на это? Поскольку я не хочу возиться с настройками сервера, поскольку есть действующий веб-сайт, работающий на том же движке базы данных.

Заранее большое спасибо.

Меня попросили опубликовать код здесь, так что это код в его нынешнем виде.

AddWord.html Я только добавил форму, так как это все, что нужно увидеть.

 <form name="addwrd" action="addWord.php" method="post">
                        <label for="greek_word">Greek Word</label>
                        <input type="text" onkeyup="trans(this.id)" id="greek_word" name="GreekWord" size=30><br><br>                        
                        <label for="greek_definition">Greek Definition</label>  
                        <input type="text" onkeyup="trans(this.id)" id="greek_definition" name="GreekDefinition" size=30><br><br>
                        <label for="EnglishWord">English Word</label>
                        <input type="text" name="EnglishWord" size=30><br><br>
                        <label for="EnglishDefinition">English Word</label>
                        <input type="text" name="EnglishDefinition" size=30><br><br>
                        <label for="chapter">Chapter</label>
                        <input type="text" name="chapter" size=20><br><br>
                        <label for="section">Section</label>
                        <input type="text" name="section" size=20><br><br>
                        <label for="hint">Hint</label>
                        <input type="text" name="hint" size=50><br><br>
                        <input type="submit" name="addword" value="Submit">
                    </form>
  

AddWord.php

 include_once( 'admin_dataHandler.php' );

$dataHandler = new DataConnection();

/** 
 * The variables we're getting back from the HTML form we've just filled
 * in.
 */
$greekWord = $_POST['GreekWord'];
$greekDef = $_POST['GreekDefinition'];
$englishWord = $_POST['EnglishWord'];
$englishDef = $_POST['EnglishDefinition'];
$chapter = $_POST['chapter'];
$section = $_POST['section'];
$hint = $_POST['hint'];

$dataHandler->addWord($greekWord, $greekDef, $englishWord, $englishDef, $chapter, $section, $hint);
// The header should redirect to the admin index.html page.
  

И это код из обработчика данных, который добавляет слово в базу данных.

 function addWord($grkWrd, $grkDef, $engWord, $engDef, $chptr, $sects, $hint){
            $sql = "INSERT INTO word (GreekWord, GreekDefinition, EnglishWord, EnglishDefinition, Chapter, Sections,Hint) values (:grkWrd,:grkDef,:engWrd,:engDef,:chptr,:sctn,:hnt)";
            $stmt = $this->dataHandler->prepare( $sql );
            $stmt->bindParam(':grkWrd', $grkWrd , PDO::PARAM_STR, 45);
            $stmt->bindParam(':grkDef', $grkDef , PDO::PARAM_STR, 45);
            $stmt->bindParam(':engWrd', $engWord , PDO::PARAM_STR, 45);
            $stmt->bindParam(':engDef', $engDef , PDO::PARAM_STR, 45);
            $stmt->bindParam(':chptr', $chptr , PDO::PARAM_STR, 45);
            $stmt->bindParam(':sctn', $sects , PDO::PARAM_STR, 45);
            $stmt->bindParam(':hnt', $hint , PDO::PARAM_STR, 45);
            $stmt->execute();
        }
  

Я надеюсь, что это предоставит дополнительную информацию, приношу извинения за то, что не опубликовал код с первого раза.

Спасибо, что нашли время взглянуть на это.

Валлиец

Комментарии:

1. » Я пошел добавить кое-что в базу данных «. Как? Через PHP-код? phpMyAdmin? Прямой доступ к MySQL?

2. Я добавляю данные через HTML-форму, которая отправляет их в PHP-файл, который действует как интерфейс между HTML и data_admin_handler.php файл, содержащий sql-запрос. Однако это отлично работало на локальном компьютере разработчика… что я нахожу странным.

3. Приятное чтение (если вы еще не прочитали это): joelonsoftware.com/articles/Unicode.html

4. Я прочитаю это сейчас, спасибо за ссылку :-

Ответ №1:

Я думаю, что все эти греческие символы должны содержаться в UTF8, и это избавило бы вас от лишних хлопот, настроив все на использование UTF8.

Вы говорили о кодах Unicode с греческими символами, но greek параметры сортировки — это не unicode, это ISO 8859-7 (см. Наборы символов и параметры сортировки, поддерживаемые MySQL)

Всего несколько дней назад я написал статью о проблемах с набором символов в PHP / MySQL, в которой, я думаю, могла бы содержаться некоторая соответствующая информация. Как избежать проблем с кодировкой символов в PHP

Комментарии:

1. Прошу прощения за путаницу, когда я заглядываю в свою базу данных, вот что я вижу: amp;#964;amp;#949;amp;#963;amp;#964; Но на удаленном сайте, который я получаю??????? Я думал, что это Юникод, но, очевидно, я ошибаюсь, спасибо за исправление

2. что??? где MySQL пытался перевести символы из одной кодировки в другую (где кодировка соединения отличается от сортировки таблицы)

3. В конце концов, я изменил кодировку полей на utf8_unicode_ci, и это, казалось, устранило проблему. Мне пришлось сделать это в myPHPAdmin. Просто хотел сказать спасибо, что нашли время ответить, и @JamesC ваш ответ заставил меня двигаться в правильном направлении. Отличный пост в блоге. Большое спасибо

Ответ №2:

Я действительно сомневаюсь, что проблема в базе данных. Вам следует дважды проверить свой код или опубликовать его здесь, потому что это, безусловно, наиболее вероятный виновник.