MySQL欧洲人物

Pet*_*ter 6 mysql utf-8 character-encoding

我无法想象我的生活.

我有一个查询,可以在页面上提取元素的翻译.因此,该页面上可以显示任意数量的15种语言.当我开始添加瑞典语等任何具有符号的语言时,例如ö整个字段中的结果返回一个空字符串.

我已经验证了桌面上的编码,它声称它正在使用,UTF-8但看到这不起作用我很困惑.

这是我正在使用的查询:

SELECT
   form.form_id,
   elem.elem_type,
   elem.elem_name,
   elem.elem_format,
   elem.elem_required,
   trans.trans_label,`
   trans.trans_description,
   trans.trans_defaultValue,
   trans.trans_other,
   elem.elem_advancedcommand
FROM
   events_form form
LEFT JOIN
   events_form_elements elem
ON
   form.event_id = elem.event_id
INNER JOIN
   events_form_translations trans
ON
   elem.elem_id = trans.elem_id
INNER JOIN
   events_form_languages lang
ON
   trans.lang_id = lang.lang_id
WHERE 
   form.form_id = '{$formid}' AND lang.language = '{$language}'
ORDER BY
   elem.elem_sortorder
Run Code Online (Sandbox Code Playgroud)

现在我尝试做类似的事情:

CONVERT(CAST(trans.trans_description as BINARY) USING latin1) as trans_description,

强制它转换编码,但根本不会产生结果.

在我得到结果后,它立即被json_encoded并返回给用户(Ajax请求).我不认为这是json_encode,因为做一个print_r输出数组会产生同样的问题.

另外..最后,我正在构建的系统是使用xPDO所以我不太确定这是否也是问题.

编辑:似乎PHP正在返回一个正确的值或至少一个值,例如这里是一个print_r转储:

[trans_label] => Ditt f?rnamn?
[trans_description] => 
[trans_defaultValue] => First Name
Run Code Online (Sandbox Code Playgroud)

因此,当我的json_encode触及该字符串时,它似乎将字符串转换为null.

Jon*_*oni 10

您的PDO连接字符串应指定编码.例如:

mysql:host=localhost;port=3306;dbname=test;charset=utf8
Run Code Online (Sandbox Code Playgroud)

这将控制数据库驱动程序在返回结果时将使用的编码,以及驱动程序假定您的查询所在的编码.如果未指定,则将使用默认编码.通常默认是latin1.

您可以通过bin2hex在PHP中打印数据的十六进制表示来确认这一点:förnamn中的ö返回为f6.如果文本以UTF-8编码,您将获得c3b6.