我可以在我的本地机器上插入阿拉伯语阿拉伯语/希伯来语/中文,这是: Windows 10 / xampp / PHP 5.6.23 / MySQL 5.7.19
但不是在Prod服务器上: Ubuntu 16.04 LTS / nginx / PHP 7.0.22 / MySQL 5.7.20
要插入文本的表格字段的排序规则是utf8_unicode_ci。
要在数据库中插入的PHP代码很简单:
$sql = $dataBase->prepare('INSERT INTO sa__user_desc(user_id,
lang,
description)
VALUES(:user_id,
:lang,
:desc)');
$sql->execute(array('user_id' => $theId,
'lang' => 'ar',
'desc' => $value));
$sql->closeCursor();
这很奇怪,因为在服务器上它没有插入任何内容,在尝试插入上述语言之一时绝对没有新行。但是在插入英文或德文或法文文本时,可以使用和插入新行。
日志文件/var/log/nginx/mywebsite.com-error.log上没有错误!这真的很奇怪!
更新
使用phpMyAdmin插入中文字符时正常工作。所以它不是MySQL数据库,问题可能来自PHP。
解
这是一个PHP问题:当if(str_word_count($value) != 0) {
包含PHP 7.0.22的一些阿拉伯语文本时,$value
返回0,而对于使用PHP 5.6.23的本地安装,if($value != '') {
不返回0。
所以我将其更改为<?php
try {
$conn = new PDO("sqlsrv:Server=(local);Database=SomeDatabase", "SomeUser", "SomePassword");
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$user = explode('\\', strtolower($_SERVER['AUTH_USER'])); //Split AUTH_USER into domain and username String
/*Check if user in Database*/
$sql = "SELECT * FROM account WHERE domain=:dom AND username=:user;";
$preparedQuery = $conn->prepare($sql);
if(!$preparedQuery->execute([':dom' => $user[0], ':user' => $user[1]])){
die('There was an error running the query.');
}
if ($preparedQuery->rowCount() == 1) {
echo "Willkommen, ".$user[1];
} else {
echo "Sorry, we are missing your account!<BR>Please contact our administrator.";
}
} catch(Exception $e) {
die(print_r($e->getMessage()));
}
。
我知道我应该在DEV和PROD环境中拥有相同版本的PHP,但这意味着我需要花一些时间来检查如何在xampp上升级它。 :P
答案 0 :(得分:1)
(这并不一定能解释两台服务器的差异,但......)
对于中国人,你真的需要utf8mb4
; MySQL utf8
中缺少许多中文字符(4字节字符)。 (英语,德语,法语,阿拉伯语和希伯来语都在utf8中工作。)
由于您使用latin1
中找到的字符取得了成功,我怀疑有一个不同的设置。
参见&#34;最佳实践&#34;在Trouble with UTF-8 characters; what I see is not what I stored。并且,如果您遇到其他症状,该链接可能对此有所帮助。