从Bash向Mysql数据库写入UTF-8编码的数据

3

我遇到了在 utf-8 编码下写入 mysql 数据库的问题。我的应用程序有点复杂,所以我将尽可能具体地描述。(我的应用程序需要使用斯洛伐克特殊字符(这些字符位于 utf-8 中),例如 ľščťžýáí 等等。

我正在运行 debian。我相信我的语言环境已经正确设置,但为了确保:

root@radiator:/var/scripts# locale
locale: Cannot set LC_CTYPE to default locale: No such file or directory
locale: Cannot set LC_MESSAGES to default locale: No such file or directory
locale: Cannot set LC_ALL to default locale: No such file or directory
LANG=sk_SK.UTF-8
LANGUAGE=sk_SK.UTF-8:cs_CZ.UTF-8
LC_CTYPE="sk_SK.UTF-8"
LC_NUMERIC="sk_SK.UTF-8"
LC_TIME="sk_SK.UTF-8"
LC_COLLATE="sk_SK.UTF-8"
LC_MONETARY="sk_SK.UTF-8"
LC_MESSAGES="sk_SK.UTF-8"
LC_PAPER="sk_SK.UTF-8"
LC_NAME="sk_SK.UTF-8"
LC_ADDRESS="sk_SK.UTF-8"
LC_TELEPHONE="sk_SK.UTF-8"
LC_MEASUREMENT="sk_SK.UTF-8"
LC_IDENTIFICATION="sk_SK.UTF-8"
LC_ALL=

我有一个bash脚本,应该将文本(用斯洛伐克语写成)写入数据库。(第一个井号是因为Debian不知道如何处理BOM,仍然不知道如何处理它。)

#
#!/bin/bash
table=$1
cycle=$2
sstart=$3
eend=$4
dbtext=$(cat /var/www/vids/$5/vars/$5.recogn.p.tmp2)

qry="INSERT INTO  \`video\`.\`$table\` (\`DB_ID\` , \`LNX_ID\` , \`STIME\` , \`ETIME\` , \`TEXT\` ) VALUES ( NULL , '$cycle', '$sstart', '$eend', '$dbtext');"

mysql --host=localhost --database 'video' --user=uzivatel --password=heslo << eof
$qry
eof

这是提到的tmp2文件的内容(该文件的编码为utf-8):
Tá žena držal poznali poznal jeho rodičov poznali podsvetie hodváb ulsteru mám ostatných tak veľmi dobre ako boli pre nato že sa bude vydávať ale skóre nevyšlo to potom zas nasťahovala.

在phpmyadmin中,它看起来像这样:
Tá žena držal poznali poznal jeho rodiÄov poznali podsvetie hodváb ulsteru mám ostatných tak veľmi dobre ako boli pre nato že sa bude vydávaÅ¥ ale skóre nevyÅ¡lo to potom zas nasÅ¥ahovala.

这个字段的编码是utf8_slovak_ci(斯洛伐克语不区分大小写),而谷歌浏览器的编码是utf8。我花了整整一天时间在谷歌上搜索,但还是不知道问题出在哪里。请问你能帮我吗?我知道你是最棒的.. :)

1个回答

8

看起来你的UTF-8输入在某个时候被解释为单字节编码,最有可能是由于数据库连接默认为latin1,最终被mysql本身解释。

试着在你的mysql调用中添加--default-character-set=utf8。(或者,在查询前加上SET NAMES utf8,具有相同的效果。)


1
Pekka,你现在对我来说就是神了.. :) 谢谢,运行得很好..! - Tommy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接