質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

JSP

JSP(Java Server Pages)とは、ウェブアプリケーションの表示レイヤーに使われるサーバーサイドの技術のことです。

サーブレット

サーブレット(Servlets)とはウェブやアプリケーションサーバー上に動くプログラムのことであり、ウェブブラウザや他のHTTPクライエントとデータベースやHTTPサーバー上のアプリケーションの中間層としての働きをします。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

Q&A

解決済

2回答

2311閲覧

入力フォームから入力されたデータをデータベースに追加すると文字化けしてしまう

kokok

総合スコア145

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

JSP

JSP(Java Server Pages)とは、ウェブアプリケーションの表示レイヤーに使われるサーバーサイドの技術のことです。

サーブレット

サーブレット(Servlets)とはウェブやアプリケーションサーバー上に動くプログラムのことであり、ウェブブラウザや他のHTTPクライエントとデータベースやHTTPサーバー上のアプリケーションの中間層としての働きをします。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

0グッド

0クリップ

投稿2019/09/06 07:47

編集2019/09/06 08:21

html

1<%@ page language="java" contentType="text/html; charset=UTF-8" 2 pageEncoding="UTF-8"%> 3<!DOCTYPE html> 4<html> 5<head> 6<meta charset="UTF-8"> 7<title>ホーム</title> 8</head> 9<body> 10<form action="/webkensyu/Address" method="get"> 11<button type="submit" name="button1">住所一覧</button> 12</form> 13</body> 14</html>

java

1package servlet; 2 3import java.io.IOException; 4import java.util.ArrayList; 5 6import javax.servlet.RequestDispatcher; 7import javax.servlet.ServletException; 8import javax.servlet.annotation.WebServlet; 9import javax.servlet.http.HttpServlet; 10import javax.servlet.http.HttpServletRequest; 11import javax.servlet.http.HttpServletResponse; 12 13import dao.ADDR_DB; 14 15@WebServlet("/Address") 16public class Address extends HttpServlet { 17 private static final long serialVersionUID = 1L; 18 19 20 public Address() { 21 super(); 22 } 23 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 24 // TODO Auto-generated method stub 25 //response.getWriter().append("Served at: ").append(request.getContextPath()); 26 27 request.setCharacterEncoding("UTF-8"); 28 ADDR_DB addrdb = new ADDR_DB(); 29 ArrayList<String> result = addrdb.getaddrss(); 30 ArrayList<String> post = addrdb.getpost(); 31 request.setAttribute("result", result); 32 request.setAttribute("post", post); 33 RequestDispatcher dispatcher = request.getRequestDispatcher("/address_view.jsp"); 34 dispatcher.forward(request, response); 35 } 36 37 38 protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 39 doGet(request, response); 40 } 41} 42

html

1 2//address_view.jsp ファイル名 3 4<%@ page language="java" contentType="text/html; charset=UTF-8" 5 pageEncoding="UTF-8"%> 6 <%@ page import="java.util.ArrayList"%> 7<!DOCTYPE html> 8<html> 9<head> 10<meta charset="UTF-8"> 11<title>住所一覧</title> 12 <link rel="stylesheet" type="text/css" href="style2.css"> 13 </head> 14</head> 15<body> 16<table border="1"style="border: 1px solid black; border-collapse: collapse;"> 17<%ArrayList<String> address = (ArrayList<String>) request.getAttribute("result");%> 18<%ArrayList<String> post = (ArrayList<String>) request.getAttribute("post");%> 19<%int i=0;%> 20<tr> 21<th class="th1">郵便番号</th> 22<th class="th2">住所</th> 23</tr> 24<%for(String addr : address){ %> 25<tr> 26<td class="th1"> 27<%=post.get(i)%> 28</td> 29<td class="th2"> 30<a href=""><%=addr%></a> 31</td> 32</tr> 33<%i++;%> 34<%}%> 35<tr> 36<td class="td3"> 37<div class="button1"> 38<form action="address_add.jsp" method="get"> 39<button type="submit" name="button1" >追加</button> 40</form> 41</div> 42</td> 43</tr> 44</table> 45<form action="address.jsp" method="get"> 46<button type="submit" name="button2">戻る</button> 47</form> 48<form action="addr_update.jsp" method="get"> 49<button type="submit" name="button4">住所更新</button> 50</form> 51</body> 52</html>

html

1//"address_add.jsp ファイル名 2 3<%@ page language="java" contentType="text/html; charset=UTF-8" 4 pageEncoding="UTF-8"%> 5<!DOCTYPE html> 6<html> 7<head> 8<meta charset="UTF-8"> 9<title>住所登録</title> 10</head> 11<body> 12<form action="/webkensyu/Add_address" method="get"> 13<p><label>郵便番号を入力してください:<input type="text" name ="text1"></label></p> 14<p><label>県を入力してください :<input type="text" name ="text2"></label></p> 15<p><label>市町村を入力してください :<input type="text" name ="text3"></label></p> 16<p><label>番地を入力してください :<input type="text" name ="text4"></label></p> 17<button type="submit" name="button1">登録</button> 18</form> 19</body> 20</html>

java

1//Add_address ファイル名 2 3package servlet; 4 5import java.io.IOException; 6 7import javax.servlet.RequestDispatcher; 8import javax.servlet.ServletException; 9import javax.servlet.annotation.WebServlet; 10import javax.servlet.http.HttpServlet; 11import javax.servlet.http.HttpServletRequest; 12import javax.servlet.http.HttpServletResponse; 13 14import dao.ADDR_DB; 15 16@WebServlet("/Add_address") 17public class Add_address extends HttpServlet { 18 private static final long serialVersionUID = 1L; 19 20 public Add_address() { 21 super(); 22 } 23 24 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 25 26 request.setCharacterEncoding("utf-8"); 27 String text1 = request.getParameter("text1"); 28 String text2 = request.getParameter("text2"); 29 String text3 = request.getParameter("text3"); 30 String text4 = request.getParameter("text4"); 31 ADDR_DB addrdb = new ADDR_DB(); 32 33 boolean result =addrdb.add_Registration(text1, text2, text3, text4); 34 35 if(result == true) { 36 RequestDispatcher dispatcher = request.getRequestDispatcher("/regis_success.jsp"); 37 dispatcher.forward(request, response); 38 39 }else { 40 RequestDispatcher dispatcher = request.getRequestDispatcher("/regis_failure.jsp"); 41 dispatcher.forward(request, response); 42 } 43 } 44 45 protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 46 doGet(request, response); 47 } 48} 49

java

1 2// ADDR_DB ファイル名 3 4package dao; 5 6import java.sql.PreparedStatement; 7import java.sql.ResultSet; 8import java.sql.SQLException; 9import java.util.ArrayList; 10 11public class ADDR_DB extends DBIO{ 12 13 public ADDR_DB(){ 14 connect(); 15 } 16 17 //郵便番号の取得 18 public ArrayList<String> getpost(){ 19 ArrayList<String> post = new ArrayList<String>(); 20try { 21 22 connect(); 23 24 String sql ="SELECT address_code FROM addresses"; 25 26 27 PreparedStatement pstmt = conn.prepareStatement(sql); 28 ResultSet rs = pstmt.executeQuery(); 29 30 while(rs.next()) { 31 32 post.add(rs.getString("address_code")); 33 } 34 35 }catch(SQLException e){ 36 37 e.printStackTrace(); 38 39 }finally { 40 41 close(); 42 } 43 44 return post; 45 } 46 47 48 //住所一覧取得する 49 public ArrayList<String> getaddrss() { 50 ArrayList<String> result = new ArrayList<String>(); 51 52 try { 53 54 connect(); 55 56 String sql ="SELECT CONCAT(address_prefecture, address_city, address_street) AS address FROM addresses"; 57 58 59 PreparedStatement pstmt = conn.prepareStatement(sql); 60 ResultSet rs = pstmt.executeQuery(); 61 62 while(rs.next()) { 63 64 result.add(rs.getString("address")); 65 } 66 67 }catch(SQLException e){ 68 69 e.printStackTrace(); 70 71 }finally { 72 73 close(); 74 } 75 return result; 76 } 77 78 //住所の登録 79 public boolean add_Registration(String post, String prefe, String munici, String addr) { 80 81 try { 82 connect(); 83 84 String sql = "INSERT INTO addresses(address_code,address_prefecture,address_city,address_street )VALUES(?,?,?,?) "; 85 PreparedStatement pstmt = conn.prepareStatement(sql); 86 pstmt.setString(1, post); 87 pstmt.setString(2, prefe); 88 pstmt.setString(3, munici); 89 pstmt.setString(4, addr); 90 int rs = pstmt.executeUpdate(); 91 if(rs == 1) { 92 93 return true; 94 }else { 95 return false; 96 97 } 98 99 }catch(SQLException e) { 100 101 e.printStackTrace(); 102 }finally { 103 close(); 104 } 105 return false; 106 } 107} 108

java

1 2// DBIO ファイル名 3package dao; 4 5import java.sql.Connection; 6import java.sql.DriverManager; 7import java.sql.PreparedStatement; 8import java.sql.ResultSet; 9import java.sql.SQLException; 10import java.util.ArrayList; 11 12public class DBIO { 13 14 protected static final String DBNAME = "jdbc:mysql://localhost:3306/webkensyu?useUnicode =true&characterEncoding=utf8"; 15 protected static final String DBUSER = "user"; 16 protected static final String DBPASS = "pass"; 17 protected Connection conn; 18 19 public DBIO(){ 20 this.connect(); 21} 22 23 public void connect() { 24 try { 25 Class.forName("com.mysql.jdbc.Driver"); 26 27 conn = DriverManager.getConnection(DBNAME,DBUSER,DBPASS); 28 29 30 } catch(SQLException e) { 31 32 e.printStackTrace(); 33 34 }catch(ClassNotFoundException e) { 35 36 e.printStackTrace(); 37 38 } 39 } 40 41 public void close() { 42 43 if(conn != null) { 44 try { 45 conn.close(); 46 }catch(SQLException e) { 47 e.printStackTrace(); 48 } 49 } 50 } 51} 52

address_add.jsp ファイル名 の 入力フォームからデータを入力して Add_address サーブレットで受け取り、 ADDR_DB の  add_Registration(String post, String prefe, String munici, String addr) メソッドでデータ(住所の追加)をしたいとかんがえております。
しかし、追加しようとすると

com.mysql.jdbc.MysqlDataTruncation: Data truncation: Data too long for column 'address_prefecture' at row 1

at dao.ADDR_DB.add_Registration(ADDR_DB.java:93)  int rs = pstmt.executeUpdate();
at servlet.Add_address.doGet(Add_address.java:41) boolean result =addrdb.add_Registration(text1, text2, text3, text4);

上記のようなエラーが出てしまいます。
column 'address_prefecture' の定義した  VARCHAR(4) に入らないデータ(大きい)をいれようとしているからみたいです。(1などのデータをいれてみると入ります。漢字が入りません。(入っても文字化けします))
文字コードの原因もあるみたいなので、コードを確認しましたが、UTF-8で設定していると思います。

使っているものは
windows10
Server version: 5.6.19 MySQL Community Server
です。

ネットなどを調べても、なかなか自分一人で解決することが出来ませんでした。少しでも、アドバイス頂けたらほんとに助かります。

--データベース--
CREATE TABLE webkensyu.addresses
(
address_id INT NOT NULL,
address_code CHAR(8) NOT NULL,
address_prefecture VARCHAR(4) NOT NULL,
address_city VARCHAR(10) NOT NULL,
address_street VARCHAR(255),
CONSTRAINT PRIMARY KEY (address_id)
);

--追記--
address_add.jspの入力フォームに
郵便番号 111-1111
県     北
市町村   西
番地    東

と入力すると
郵便番号   111-1111
住所     æ±è¥¿å 
と表示されてしまいます 。

県 の入力フォームに 北海道など3文字とかの漢字を入力すると
com.mysql.jdbc.MysqlDataTruncation: Data truncation: Data too long for column 'address_prefecture' at row 1
とエラーになります。

sql

1INSERT INTO addresses(address_code,address_prefecture,address_city,address_street )VALUES(?,?,?,?) ;

PreparedStatement pstmt = conn.prepareStatement(sql);
pstmt.setString(1, post);
pstmt.setString(2, prefe);
pstmt.setString(3, munici);
pstmt.setString(4, addr);
int rs = pstmt.executeUpdate();

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m.ts10806

2019/09/06 08:07

実際に入れようとした文字情報と 文字化けしたという結果が分かるように 追記してください。 またSQLも一応コードですので、マークダウン利用してください
m.ts10806

2019/09/06 08:22

>UTF-8で設定していると思います。 これはきちんと確認してください。プログラムもDBも文字コードの確認はできます。
kokok

2019/09/06 08:44

確認のやり方調べて確認してみます。 ありがとうございます。
guest

回答2

0

自己解決

TomcatではデフォルトのPOSTやGETパラメータのエンコーディングがISO-8859-1になっているようです。

今回は、

<form action="/webkensyu/Add_address" method="get"> の

getをpostに変更することで解決しました。

Tomcat5から、GETの場合のsetCharacterEncoding()が無視されるようになったみたいです。

投稿2019/09/09 02:07

kokok

総合スコア145

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

~~漢字等2バイト系文字を使う場合、VARCHAR型を使うと、漢字1文字で2バイト以上を占有してしまいます。
"和歌山県"はVARCHAR(4)には収まりません。
~~
今のMySQLだと、VARCHAR型もNVARCHAR型と同様、文字数で定義できるのですね。ゴメンナサイ。
とりあえず、漢字を含む列にはNVARCHAR型を使ってみてはどうでしょう。

追記

どこかで、utf-8ではなく、UNICODE(ISO-8859-1)の文字コードの使用(または設定)をしていませんか?

投稿2019/09/06 07:58

編集2019/09/06 08:56
kenshirou

総合スコア772

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kokok

2019/09/09 02:03

コメント遅れてすいませんでした。 調べたところ TomcatではデフォルトのPOSTやGETパラメータのエンコーディングがISO-8859-1になっているみたいです。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問