У меня есть этот код
$myname="דוגמא";
$sql="insert into tbl_users values (" . $myname . ")";
$command = $con->prepare($sql);
$command->execute()
теперь, если я напишу $myname
как это
$myname="\'דוגמא\'";
это работает хорошо, иначе результаты в БД выглядят ??? или бред.
БД, таблица и столбцы настроены на «иврит».
Теперь мой вопрос: как я могу сделать это обычным способом, а не как с косыми чертами?
Хранилище данных:
Укажите utf8mb4
набор символов для всех таблиц и текстовых столбцов в вашей базе данных. Это заставляет MySQL физически хранить и извлекать значения, изначально закодированные в UTF-8. Обратите внимание, что MySQL будет неявно использовать utf8mb4
кодирование, если utf8mb4_*
указано сопоставление (без какого-либо явного набора символов).
В старых версиях MySQL (< 5.5.3), к сожалению, вы будете вынуждены использовать просто utf8
, который поддерживает только подмножество символов Unicode. Я хотел бы шутить.
Доступ к данным:
В коде вашего приложения (например, PHP), в каком бы методе доступа к БД вы ни использовали, вам нужно установить кодировку соединения в utf8mb4
, Таким образом, MySQL не выполняет преобразование из собственного UTF-8, когда передает данные в ваше приложение, и наоборот.
Некоторые драйверы предоставляют свой собственный механизм для настройки набора символов соединения, который одновременно обновляет свое собственное внутреннее состояние и сообщает MySQL о кодировке, которая будет использоваться в соединении — обычно это предпочтительный подход. В PHP:
Если вы используете PDO слой абстракции с PHP ≥ 5.3.6, вы можете указать charset
в DSN:
$dbh = new PDO('mysql:charset=utf8mb4');
Если вы используете MySQLi, ты можешь позвонить set_charset()
:
$mysqli->set_charset('utf8mb4'); // object oriented style
mysqli_set_charset($link, 'utf8mb4'); // procedural style
Если вы застряли с равниной MySQL но, случается, работает PHP ≥ 5.2.3, вы можете позвонить mysql_set_charset
.
Если драйвер не предоставляет свой собственный механизм для установки набора символов соединения, вам может потребоваться выполнить запрос, чтобы сообщить MySQL, как ваше приложение ожидает, что данные в соединении будут закодированы: SET NAMES 'utf8mb4'
.
То же самое в отношении utf8mb4
/utf8
применяется как указано выше.
Выход:
Если ваше приложение передает текст в другие системы, они также должны быть проинформированы о кодировке символов. В веб-приложениях браузер должен быть проинформирован о кодировке, в которой отправляются данные (через заголовки ответа HTTP или Метаданные HTML).
В PHP вы можете использовать default_charset
php.ini или вручную введите Content-Type
MIME заголовок самостоятельно, который просто больше работы, но имеет тот же эффект.
вход:
К сожалению, вы должны проверить каждую полученную строку как действительную UTF-8, прежде чем пытаться сохранить ее или использовать где-либо. РНР mb_check_encoding()
делает трюк, но вы должны использовать это религиозно. Это действительно невозможно, поскольку злонамеренные клиенты могут отправлять данные в любой нужной им кодировке, и я не нашел способа заставить PHP сделать это для вас надежно.
Из моего чтения текущего HTML спецификация, Следующие подпункты больше не нужны и даже не действительны для современного HTML. Насколько я понимаю, браузеры будут работать и отправлять данные в наборе символов, указанном для документа. Однако, если вы ориентируетесь на более старые версии HTML (XHTML, HTML4 и т. Д.), Эти пункты могут быть полезны:
accept-charset
приписать всем своим <form>
теги: <form ... accept-charset="UTF-8">
,<form>
тег.Другие соображения по коду:
Очевидно, что все файлы, которые вы будете обслуживать (PHP, HTML, JavaScript и т. Д.), Должны быть закодированы в допустимом UTF-8.
Вы должны убедиться, что каждый раз, когда вы обрабатываете строку UTF-8, вы делаете это безопасно. Это, к сожалению, самая сложная часть. Вы, вероятно, захотите широко использовать PHP mbstring
расширение.
PHP встроенные строковые операции не по умолчанию сейф UTF-8. Есть некоторые вещи, которые вы можете безопасно делать с обычными строковыми операциями PHP (например, конкатенация), но для большинства вещей вы должны использовать эквивалентные mbstring
функция.
Чтобы знать, что вы делаете (читай: не путайте), вам действительно нужно знать UTF-8 и как он работает на самом низком уровне. Проверьте любую из ссылок с utf8.com для некоторых хороших ресурсов, чтобы узнать все, что вам нужно знать.
Вы пытаетесь вставить строку. В SQL строки должны быть заключены в кавычки: INSERT INTO tbl_name (field_name) VALUES ("string surrounded by quotation marks");
,
Пожалуйста, рассмотрите возможность использования подходящего уровня абстракции базы данных, такого как PDO, или, что еще лучше, полнофункционального решения, такого как Doctrine.
использование UTF-8, когда ты СОЗДАЙТЕ Таблица.
create table table_name () CHARACTER SET = utf8;
использование UTF-8, когда ты ВСТАВИТЬ к столу
set username utf8; INSERT INTO table_name (ABC,VAL);
Вы можете прочитать подробно из Вот
Также проверьте ваше соединение, оно должно быть в utf-8
,
Например:
$link = mysql_connect('localhost', 'username', 'password');
mysql_set_charset('utf8',$link);